c#多线程同步之EventWaitHandle的应用
最近在研究前辈写的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的应用的更多相关文章
- c#多线程同步之EventWaitHandle再次使用
/// <summary> /// 文件传输器,用来获取全文文件,自动根据全文文件数量,开启一定数量的线程,采用生产者消费模式 /// </summary> public cl ...
- c#多线程同步之EventWaitHandle使用
有这么一个场景,我需要借助windows剪贴板把数据插入到word域中. 实现步骤: 1.把剪贴板数据保存到变量. 2.使用剪贴板实现我们的业务. 3.把变量里的数据存回剪贴板. 但是结果却令人诧异, ...
- 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 ...
随机推荐
- 【学习笔记】Spring中的BeanFactory和ApplicationContext 以及 Bean的生命周期(Y2-3-2)
BeanFactory和ApplicationContext Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类. Spring提供了两种不同的容器: 一种是最基本的Bean ...
- Winform下去除MDI窗体边框
做项目中间遇到了MDI窗体内边框的问题,经过苦苦寻找,最终得到了解决方案 在Main窗体中调用API // Win32 Constants ; ; private const int WS_BORDE ...
- JavaScript 一个进行枚举选择的jquery插件(仿easyui风格)
某次做项目要实现一个功能: 按星期选择一个连续的时间范围 比如:周一到周五,周六到周日 或 周六到周三 聪明的朋友马上想出办法:用两个选项为周一到周日的下拉列表实现,对 那样可以,但是我觉得不够友好, ...
- Batch Normalization&Dropout浅析
一. Batch Normalization 对于深度神经网络,训练起来有时很难拟合,可以使用更先进的优化算法,例如:SGD+momentum.RMSProp.Adam等算法.另一种策略则是高改变网络 ...
- [Note] 计算机网络的应用层
应用层 原理 结构和模型 客户-服务器体系结构(client-server architecture ) 通信不是直接的,需要通过服务器转发 经常会在服务器积压大量的负载 服务器(server) 服务 ...
- clearstatcache
clearstatcache clearstatcache — 清除文件状态缓存 void clearstatcache ([ bool $clear_realpath_cache = false [ ...
- Redis进阶实践之十四 Redis-cli命令行工具使用详解第一部分
一.介绍 redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西.现在redis的东西要看的都差不多看完了.网上的东西也不多了.剩下来就看看官网的东西吧,一遍翻译,一遍测试. ...
- swift 学习之自动引用计数
swift 学习之自动引用计数 学习和研究的主要是"实例对象和实例对象直接的相会强引用所产生的内从泄漏"和"使用闭包产生的强引用造成的内存泄漏" 注意:只有以引 ...
- js中reduce()用法
reduce()方法 定义:reduce()接收一个函数作为累加器,数组中每个值(从左到右)开始缩减,最终计算为一个值 对于空数组不执行回调函数 语法:array.reduce(function(to ...
- hi3531spi flash启动和bootrom启动的对比
a