C# 多线程处理相关说明: WaitHandle,waitCallback, ThreadPool.QueueUserWorkItem
class TestThread
{ static void Main()
{
//使用WaitHandle静态方法阻止一个线程,直到一个或多个同步对象接收到信号
WaitHandle[] waitHandles = new WaitHandle[]
{
new ManualResetEvent(false),
new ManualResetEvent(false)
}; WaitCallback waitCallback = new WaitCallback(MyThreadWork); WaitCallback waitCallback2 = new WaitCallback(MyThreadWork2); // 增加线程工作类型 ThreadPool.QueueUserWorkItem(waitCallback, "第一个线程");
ThreadPool.QueueUserWorkItem(waitCallback, "第二个线程"); MyState myState = new MyState("第三个线程", , waitHandles[]); // 增加自定义的线程参数类型 ThreadPool.QueueUserWorkItem(waitCallback2, myState);
ThreadPool.QueueUserWorkItem(waitCallback2, new MyState("第四个线程", , waitHandles[])); WaitHandle.WaitAll(waitHandles); Console.WriteLine("MyState 的 Number 值为: {0}", myState.Number); // 读取线程改变后的 MyState
} public static void MyThreadWork(object state)
{
Console.WriteLine("MyThreadWork 开始启动 …… {0}", (string)state);
Thread.Sleep();
Console.WriteLine("运行结束…… {0}", (string)state);
} // use MyState class
public static void MyThreadWork2(object state)
{
MyState myState = ((MyState)state);
Console.WriteLine("MyThreadWork2 开始启动…… {0},{1}", ((MyState)state).Info, ((MyState)state).Number);
Thread.Sleep();
((MyState)state).Number += ; // 将 state的 Number 加 1
Console.WriteLine("运行结束…… {0},{1}", ((MyState)state).Info, ((MyState)state).Number);
((ManualResetEvent)myState.DoneEvent).Set();
} } public class MyState
{
private string info;
private int number;
private WaitHandle _doneEvent; public MyState(string info, int number, WaitHandle doneEvent)
{
this.info = info;
this.number = number;
this._doneEvent = doneEvent;
} public string Info
{
get
{
return this.info;
}
set
{
this.info = value;
}
} public WaitHandle DoneEvent
{
get
{
return this._doneEvent;
}
} public int Number
{
get
{
return this.number;
}
set
{
this.number = value;
}
}
}

C# 多线程处理相关说明: WaitHandle,waitCallback, ThreadPool.QueueUserWorkItem的更多相关文章
- C#线程池ThreadPool.QueueUserWorkItem接收线程执行的方法返回值
最近在项目中需要用到多线程,考虑了一番,选择了ThreadPool,我的需求是要拿到线程执行方法的返回值, 但是ThreadPool.QueueUserWorkItem的回调方法默认是没有返回值的,搜 ...
- 多线程操作(ThreadPool.QueueUserWorkItem
主线程: private void GetPolicy_Load(object sender, EventArgs e) { ////ThreadPool.QueueUserWorkItem(new ...
- Parallel.ForEach , ThreadPool.QueueUserWorkItem
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题
ThreadPool是.net System.Threading命名空间下的线程池对象.使用QueueUserWorkItem实现对异步委托的先进先出有序的回调.如果在回调的方法里面发生异常则应用程序 ...
- 合理使用线程池 ThreadPool.QueueUserWorkItem()
//==>自建线程 new Thread(() => { //线程任务 Console.WriteLine(Thread.CurrentThread.ManagedThreadId); } ...
- 难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?
开门见山,下面的例子中通过调用ThreadPool.QueueUserWorkItem(WaitCallback callBack, object state)的方式实现异步调用: 1: class ...
- ThreadPool.QueueUserWorkItem 简单示例,显示当前时间
1.线程池 添加方法 作为一个线程运行 class Program { static void Main(string[] args) { ThreadPool.QueueUserWorkItem( ...
- ThreadPool.QueueUserWorkItem的用法
代码: ThreadPool.SetMaxThreads(, ); ThreadPool.QueueUserWorkItem((obj) => { MessageBox.Show("执 ...
- ThreadPool.QueueUserWorkItem的性能问题
在WEB开发中,为了降低页面等待时间提高用户体验,我们往往会把一些浪费时间的操作放到新线程中在后台执行. 简单的实现代码就是: //代码一 new Thread(()=>{ //do somet ...
随机推荐
- 【剑指offer 面试题38】数字在排序数组中出现的次数
思路: 利用二分查找,分别查找待统计数字的头和尾的下标,最后做差加一即为结果. C++: #include <iostream> #include <vector> using ...
- selenium python (三)鼠标事件
# -*- coding: utf-8 -*-#鼠标事件 #ActionChains类中包括: # context_click() 右击: ...
- 通知(Toast+Notification)
Toast简要说明:(前面已经用过好多次了) Toast是一种非持久的(在屏幕上面留一会儿就消失了),提供给用户简洁提示信息的视图. 它不阻断用户的操作,一般用于显示一些不重要的信息.(比方说设置音量 ...
- WinForm 中两个窗口之间传递数据
方法有很多种,这里介绍项目中使用的两种 一.通过委托+事件的方法进行传值 (点击Form2中的button1按钮,将会把Form2中的textbox.text 传给Form1中的 lable.text ...
- Python:字符串
一.序列的概念 序列是容器类型,顾名思义,可以想象,“成员”们站成了有序的队列,我们从0开始进行对每个成员进行标记,0,1,2,3,...,这样,便可以通过下标访问序列的一个或几个成员,就像C语言中的 ...
- 《学习OpenCV》练习题第四章第一题a
#include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...
- SQL Case When Then
适用sqlServer,oracle CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 WHEN 条件3 THEN 结果3 WHEN 条件4 T ...
- Represent nil with NSNull
[Represent nil with NSNull] It’s not possible to add nil to the collection classes described in this ...
- Labview二进制文件的操作
- centos安装postfixadmin
postfixadmin的安装,跟普通网站安装没什么区别 配置好虚拟目录,然后在数据库中创建数据库postfix 修改config.inc.php文件,详细搜索谷歌 访问http://www.你的域名 ...