• c#多线程同步之EventWaitHandle使用


    有这么一个场景,我需要借助windows剪贴板把数据插入到word域中。

    实现步骤:

     1、把剪贴板数据保存到变量。

     2、使用剪贴板实现我们的业务。

     3、把变量里的数据存回剪贴板。

          但是结果却令人诧异,百思不得其解。插入到word里的数据不是我们想要插入的内容,而是之前剪贴板上的数据。明明第二步一开始就把剪贴板清空了,那旧数据是怎么插入到word中呢?经过我测试,只要执行第一步,就会插入脏数据。我查了下剪贴板的实现原理,它是使用一块应用程序共享的内存,为应用程序之间传递数据。

          从结果上看第一步影响了第二步,为了不影响,我想到了使用多线程来解决问题。具体就是开启一个线程来执行第一步,等执行完毕后,然后主线程再执行后续的步骤。如此,就解决了问题。见源码: 

    复制代码
                EventWaitHandle backUpWait = new EventWaitHandle(false, EventResetMode.ManualReset);
                Thread thread = new Thread(() =>
                {
                    if (Clipboard.GetData(DataFormats.Text) != null)
                        clipboardText = Clipboard.GetData(DataFormats.Text).ToString();
                    if (Clipboard.GetData(DataFormats.Rtf) != null)
                        clipboardRtf = Clipboard.GetData(DataFormats.Rtf).ToString();
                    backUpWait.Set();
                });
                thread.Start();
                backUpWait.WaitOne();
                Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
                Clipboard.Clear();
                Clipboard.SetData(System.Windows.Forms.DataFormats.Rtf, null);
                Clipboard.SetData(System.Windows.Forms.DataFormats.Text, null);
                Clipboard.SetData(System.Windows.Forms.DataFormats.Rtf, str_Content);
     
    复制代码
    源码解析:我使用了EventWaitHandle类,这个类的层次结构见下图:

          从图上看,EventWaitHandle的父类是WaitHandler,有两个子类,一个是AutoResetEvent,另一个是ManualResetEvent。我们使用EventResetMode.ManualReset 手动设置模式,类似于ManualResetEvent类。EventWaitHandle对象有两种状态:终止状态和非终止状态。在非终止状态下,某个线程调用其WaitOne方法,阻止此线程继续执行,也就是处于阻塞状态。 当一个线程调用Set方法时,其它阻塞的线程被释放,继续执行,此时EventWaitHandle处于终止状态。这就是其工作原理。

     
  • 相关阅读:
    "倒计时"组件:<count-down> —— 快应用组件库H-UI
    "徽标组件"组件:<brage> —— 快应用组件库H-UI
    "头像组件"组件:<avatar> —— 快应用组件库H-UI
    "广告组件"组件:<ad> —— 快应用组件库H-UI
    "引用风格"组件:<blockquote> —— 快应用组件库H-UI
    "缩略语"组件:<abbr> —— 快应用组件库H-UI
    "地址"组件:<address> —— 快应用组件库H-UI
    "网页组件"组件:<web-view> —— 快应用组件库H-UI
    "音频播放器"组件:<audio-player> —— 快应用组件库H-UI
    "视频播放器"组件:<video-player> —— 快应用组件库H-UI
  • 原文地址:https://www.cnblogs.com/wwwbdabc/p/10400485.html
Copyright © 2020-2023  润新知