最近在研究前辈写的winform代码,其中有一个功能,前辈用了EventWaitHandle。初读代码,有点不理解,慢慢想来,还是可以理解的。这个功能,就是执行某项比较耗时的任务,需要打开旋转图标,等任务执行完成后,再关闭旋转图标。这是程序主体框架:

  public void ImportFile(List<string> files)
{
bool state = true;
EventWaitHandle wait = new EventWaitHandle(false, EventResetMode.ManualReset);
EventWaitHandle loadWait = new EventWaitHandle(false, EventResetMode.ManualReset); Thread thread = new Thread(delegate(object obj)
{
loadWait.WaitOne();
EventWaitHandle waitHandle = obj as EventWaitHandle; try
{
//执行比较耗时的任务
}
catch
{
state = false;
}
waitHandle.Set();
}); thread.Start(wait);
new OperationTip().ShowWait(wait, loadWait, MainForm._MainForm); if (!state)
{
new ServerErrorInformation().ShowDialog(MainForm._MainForm);
return;
}
}

解释:线程(给个名称:TaskThread)启动后(23行),被阻塞了(第9行loadWait.Wait() )。那什么时候解除阻塞呢?24行实例化了一个OperationTip对象,而且调用了ShowWait方法,我想秘密就在这个类里面:

    public partial class OperationTip : Form
{
public delegate void CloseThis();
EventWaitHandle loadWait = null;public OperationTip()
{
InitializeComponent();
this.Icon = Resources.NoteFirst;
this.ptbMain.Image = Resources.SystemProcess_1;
this.ShowInTaskbar = false;
}private void OperationTip_Load(object sender, EventArgs e)
{
if (point.X == && point.Y == )
{
this.StartPosition = FormStartPosition.CenterParent;
}
else
{
this.Location = new Point(point.X, point.Y);
}
if (loadWait != null)
loadWait.Set();
} public void ShowWait(EventWaitHandle wait, EventWaitHandle loadWait, IWin32Window window)
{
this.loadWait = loadWait;
ThreadPool.QueueUserWorkItem(delegate
{
wait.WaitOne();
if (this.InvokeRequired)
{
this.Invoke(new CloseThis(CloseThisForm));
}
else
{
CloseThisForm();
}
});
this.ShowDialog(window);
}
public void CloseThisForm()
{
this.Close();
}
}

很有意思的是 ShowWait方法里,又开启了一个线程(起个名称:closeThread),这个线程专门负责关闭当前的旋转图标(OperationTip 窗体,整个窗体看起来就是一个旋转图标)。此线程目前被阻塞,ShowDialog方法调用后,OperationTip_Load方法才开始执行,此时 loadWait.Set(),让TaskThread 才开始执行,等执行完了,第20行 waitHandle.Set()方法的执行,它解除了closeThread线程的阻塞,让closeThread线程继续运行,那么旋转图标就被关闭了。

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

  1. c#多线程同步之EventWaitHandle再次使用

    /// <summary> /// 文件传输器,用来获取全文文件,自动根据全文文件数量,开启一定数量的线程,采用生产者消费模式 /// </summary> public cl ...

  2. c#多线程同步之EventWaitHandle使用

    有这么一个场景,我需要借助windows剪贴板把数据插入到word域中. 实现步骤: 1.把剪贴板数据保存到变量. 2.使用剪贴板实现我们的业务. 3.把变量里的数据存回剪贴板. 但是结果却令人诧异, ...

  3. C#多线程同步案例实操

    好久没有写博客了,为了养成学习的习惯,培养积极年轻的心态,又回到了博客园这个平台继续撸起时隔多年未光顾的空间. 项目需求: 实现一个简单的获取始发目的耗时.距离,将结果输出表格. 方案思路: 通过多线 ...

  4. c#中多线程同步Lock(锁)的研究以及跨线程UI的操作

    本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...

  5. C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent

    最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...

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

    C# 中提供多线程同步退出机制,详参对象: CancellationTokenSource CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用 ...

  7. Servlet基础(三) Servlet的多线程同步问题

    Servlet基础(三) Servlet的多线程同步问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率. 由于Servlet/JSP默认是以多线程模式执行的, ...

  8. Linux多线程同步方式

    当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作 ...

  9. C# 多线程同步和线程通信

    多线程通信 1. 当线程之间有先后的依赖关系时,属于线程之间的通信问题.也就是后一个线程要等待别的一个或多个线程全部完成,才能开始下一步的工作.可以使用: WaitHandle Class WaitH ...

随机推荐

  1. HDU 3001(状态压缩dp)

    状态压缩dp的第一题! 题意:Mr ACMer想要进行一次旅行,他决定访问n座城市.Mr ACMer 可以从任意城市出发,必须访问所有的城市至少一次,并且任何一个城市访问的次数不能超过2次.n座城市间 ...

  2. pro asp.net mvc 5笔记

    1.Ninject条件绑定方法When(predicate)WhenClassHas<T>()WhenInj ectedInto<T>()例: kernel.Bind<I ...

  3. Java8的一些新特性

    速度更快: 代码更少(增加了新的语法Lamdba表达式): Lamdba操作符"->" 语法格式: 左侧:参数列表 右侧:接口抽象方法的实现功能 Lamdba表达式 3.强大 ...

  4. AssetBundle实现服务器下载并从本地读取

    废话不多说  直接上代码. 从服务器下载的, 很简单 private IEnumerator Start() { byte[] ab = null; int len = 0; WWW www =nul ...

  5. C++学习笔记第二天:几个知识点

    第一天,囫囵吞枣的把C++的基本概念撸了一遍 有几个地方不太理解,今天有针对性的学习一下 1.namespace 自定义命名空间,主要为了解决类.函数和全局变量的命名冲突问题. 调用某个命名空间里的符 ...

  6. qml 静态编译程序执行错误 无法定位程序输入点 CreateDXGIFactory2 于动态链接库 dxgi.dll 上

    重新编译 qt 静态库即可,或 删除该动态库. -no-feature-d3d12 解决方案请参考如下网址: https://forum.qt.io/topic/78380/entry-point-n ...

  7. HDU - 1847 巴什博弈

    思路:    0  1  2  3  4  5  6  7  8  9 10 11 12    P N  N P  N N  P N N  P N   N   P 不难发现:当n为三的倍数时,KIKI ...

  8. 记录一个 spring cloud 配置中心的坑,命令行端口参数无效,被覆盖,编码集问题无法读取文件等.

    spring cloud 配置中心 结合GIT , 可以运行时更新配置文件.发送指令让应用重新读取配置文件. 最近在测试服务器实现了一套,结果CPU 实用率暴增,使用docker compose启动 ...

  9. hive:条件判断函数

    参考hive常用运算. •If函数: if •非空查找函数: COALESCE •条件判断函数:CASE • If 函数 : if 语法: if(boolean testCondition, T va ...

  10. 定义一个Matrix类,实现矩阵的加法和乘法

    #include<iostream> using namespace std; class Matrix { int row;//矩阵的行 int col;//矩阵的列 int **a;/ ...