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处于终止状态。这就是其工作原理。
.png)
c#多线程同步之EventWaitHandle使用的更多相关文章
- c#多线程同步之EventWaitHandle再次使用
/// <summary> /// 文件传输器,用来获取全文文件,自动根据全文文件数量,开启一定数量的线程,采用生产者消费模式 /// </summary> public cl ...
- c#多线程同步之EventWaitHandle的应用
最近在研究前辈写的winform代码,其中有一个功能,前辈用了EventWaitHandle.初读代码,有点不理解,慢慢想来,还是可以理解的.这个功能,就是执行某项比较耗时的任务,需要打开旋转图标,等 ...
- C#多线程同步案例实操
好久没有写博客了,为了养成学习的习惯,培养积极年轻的心态,又回到了博客园这个平台继续撸起时隔多年未光顾的空间. 项目需求: 实现一个简单的获取始发目的耗时.距离,将结果输出表格. 方案思路: 通过多线 ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...
- C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent
最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...
- C# 中 多线程同步退出方案 CancellationTokenSource
C# 中提供多线程同步退出机制,详参对象: CancellationTokenSource CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用 ...
- Servlet基础(三) Servlet的多线程同步问题
Servlet基础(三) Servlet的多线程同步问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率. 由于Servlet/JSP默认是以多线程模式执行的, ...
- Linux多线程同步方式
当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作 ...
- C# 多线程同步和线程通信
多线程通信 1. 当线程之间有先后的依赖关系时,属于线程之间的通信问题.也就是后一个线程要等待别的一个或多个线程全部完成,才能开始下一步的工作.可以使用: WaitHandle Class WaitH ...
随机推荐
- CENTOS6.6上搭建单实例ORACLE12C
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 自己在centos6.6上搭建的单实例oracle12c 由 ...
- HTML/CSS 知识点
整个前端开发的工作流程 产品经理提出项目需求 UI出设计稿 前端人员负责开发静态页面(跟前端同步的后台人员在准备数据) 前后台的交互 测试 产品上线(后期项目维护) 互联网原理 当用户在浏览器输入网址 ...
- 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)
本节开始学习 Service.我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller 会通 ...
- Git (gnome-ssh-askpass:3871): Gtk-WARNING **: cannot open display:
在使用Git在客户端使用git push 命令提交文件到github时,出现报错 (gnome-ssh-askpass:): Gtk-WARNING **: cannot open display: ...
- C. Vasya and String
原题链接 C. Vasya and String High school student Vasya got a string of length n as a birthday present. T ...
- 计蒜客 无脑博士 bfs
题目链接无脑博士的试管们 思路:直接模拟倒水过程即可,但是需要记忆判断当前的情况是否已经处理过.dfs和bfs都ok AC代码 #include <cstdio> #include < ...
- Redis笔记4-持久化方案
一:快照模式 默认redis是会以快照的形式将数据持久化到磁盘的(一个二进制文件,dump.rdb,这个文件名字可以指定),在配置文件中的格式是:save N M表示在N秒之内,redis至少发生M次 ...
- Ambari安装小记
在Ambari配置过程中,组件的定制与分配很重要
- 终于,我也要出一本C#的书了 - 我的写作历程与C#书单推荐
我之前的面试题停了很久,是因为 - 我写书去了. 前言 我于2012年3月开始工作,到现在马上就满六年了.这六年里,我从一个连Sql server是什么都不知道,只会写最简单的c#的程序员开始做起,一 ...
- Fresco-FaceBook推出的Android图片加载库
在Android设备上面,快速高效的显示图片是极为重要的.过去的几年里,我们在如何高效的存储图像这方面遇到了很多问题.图片太大,但是手机的内存却很小.每一个像素的R.G.B和alpha通道总共要占用4 ...