zoukankan      html  css  js  c++  java
  • 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处于终止状态。这就是其工作原理。

     
  • 相关阅读:
    百度mp3地址解密码
    VB 在EXE后附加信息
    截屏函数
    Base64和StrToByte
    The Android ION memory allocator, DMABUF is mentioned as well
    DDC EDID 介绍
    Memory management for graphic processors TTM的由来
    科普 写display driver的必看 How video card works [2D的四种主要操作]
    GEM vs TTM
    DMABUF 背景介绍文章 Sharing buffers between devices
  • 原文地址:https://www.cnblogs.com/wangqiang3311/p/5827199.html
Copyright © 2011-2022 走看看