最近在研究前辈写的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. CodeForces 820C

    题意略. 这道题目的出题者竟然被hack了!? 我的思路是:在游戏开始时,为了尽量少地用字母,我应该尽量选取计算机输出的前a个字母中已经使用过的字母.但是为了使电脑也尽量少用字母,我添加的这b个字母应 ...

  2. Ubuntu14.04+Nginx+MySql+PHP环境配置

    http://www.cnblogs.com/gophper/p/4793711.html

  3. 浏览器的 bfcache 特性

    一.bfcache 基本概念 现代浏览器在根据历史记录进行前进/后退操作时,会启用缓存机制,名为"bfcache"(back-forward cache,往返缓存),它使页面导航非 ...

  4. MacOS下SVN迁移Git踩坑记

    1. First Blood 之前在Windows环境下进行svn到git的迁移是很简单的,(参考官方文档:https://git-scm.com/book/zh/v1/Git-%E4%B8%8E%E ...

  5. GIT 查看 删除 添加远程库

    查看远程库 $ git remote -vorigin https://github.com/autoliuweijie/MachineLearning.git (fetch)origin https ...

  6. docker学习笔记(二)

    一.常用Linux 命令 ls -a(同时列出隐含文件), -l(输出一个比较完整的格式,除每个文件名外,增加显示文件 类型.权限.硬链接数.所有者名.组名.大小(byte).及时间信息-----简化 ...

  7. freemarker自定义标签报错(三)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Encountered " " at line 14, column ...

  8. freemarker写select组件(五)

    freemarker写select组件 1.宏定义 <#macro select id datas value="" key="" text=" ...

  9. Caused by: Unable to locate parent package [json-default] for [class com.you.user.action.StudentActi

    1.错误描述 信息: Choosing bean (struts) for (com.opensymphony.xwork2.util.TextParser) 2014-7-13 1:52:04 or ...

  10. MySQL查询所有数据库表出错

    1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:show tables 错误代码: 1046 No database sel ...