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处于终止状态。这就是其工作原理。

时间: 2024-07-28 16:03:46

c#多线程同步之EventWaitHandle使用的相关文章

Java多线程同步机制

Java的多线程同步机制和其他语言开发的是一样的,在当前线程中,遇到某个事件时,等待另一个线程运行结束或者另一个线程的事件,然后再决定如何处理. 本例来自书上的实例,精简了代码,调整了部分逻辑,使得看起来更加简洁明了.已经运行通过. 代码如下: package SwingExample; import java.awt.BorderLayout; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPro

多线程同步条件变量(转载)

最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 [cpp] view plaincopy #include <pthread.h> #include <stdio.h> #include <stdlib.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/ pthread_cond_

java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数封装的代码操作tickets,同步代码块中的锁我们可以指定.假设我们事先不知道同步函数用的是什么锁:如果在同步代码块中指定的某个锁(测试)和同步函数用的锁相同,就不会出现线程安全问题,如果锁不相同,就会发生线程安全问题. 看下面的代码:t1线程用的同步锁是obj,t2线程在操作同步函数的资源,假设不

多线程同步程序的测试思路

这里我有一个简单的思路,来源于去年应届生找工作做大量的名企笔试题里他人的技巧. 多线程的测试使用cout是不靠谱的,因为多个线程使用cout很容易产生混乱的输出,而且耗时. 多线程的测试往往需要知道多个线程同时运行的时候对某个共享区域的使用是否正确,为了检验正确性,比较好的测试用例就是:递增的整数序列 递增的整数序列中的每一个整数都对应一个线程的动作,最后我们将这些整数再当成另一个标记数组的下标,下标对应的值就是我们操作的动作执行的次数 只要用于标记的数组每一个元素都是1,即可. 比如: (1)

【python标准库学习】thread,threading(二)多线程同步

继上一篇介绍了python的多线程和基本用法.也说到了python中多线程中的同步锁,这篇就来看看python中的多线程同步问题. 有时候很多个线程同时对一个资源进行修改,这个时候就容易发生错误,看看这个最简单的程序: import thread, time count = 0 def addCount(): global count for i in range(100000): count += 1 for i in range(10): thread.start_new_thread(ad

通过Lock对象以及Condition对象实现多线程同步

通过Lock对象以及Condition对象实现多线程同步: 在之前的学习中,无论是通过synchronized建立同步代码块,还是通过synchronized建立同步函数,都是把对象看成一把锁来实现同步,这种解释有点牵强,而且在消费者-生产者的那个实例中,其实还有个问题,那就是在避免线程全部冻结时,没必要把相同功能的线程解冻,只要把其他功能的线程解冻即可,也就是说消费者线程只要解冻生产者线程即可,没必要把其他消费者线程也解冻,为了解决这些问题,java1.5版本推出了同步的升级办法,那就是通过L

一个经典的多线程同步问题

上一篇<秒杀多线程第三篇原子操作 Interlocked系列函数>中介绍了原子操作在多进程中的作用,现在来个复杂点的.这个问题涉及到线程的同步和互斥,是一道非常有代表性的多线程同步问题,如果能将这个问题搞清楚,那么对多线程同步也就打下了良好的基础. 程序描述: 主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程.子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量. 要求: 1.子线程输出的线

C# 中 多线程同步退出方案 CancellationTokenSource

C# 中提供多线程同步退出机制,详参对象: CancellationTokenSource CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用,需重新初使化对象. 代码示例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.

嵌入式 Linux进程间通信(十二)——多线程同步

嵌入式 Linux进程间通信(十二)--多线程同步 多线程编程中有三种线程同步机制:互斥锁.信号量.条件量.本文将使用生产者消费者问题编程实践三种线程同步方式. 生产者.消费者问题:生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 一.互斥锁