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的更多相关文章

  1. C#线程池ThreadPool.QueueUserWorkItem接收线程执行的方法返回值

    最近在项目中需要用到多线程,考虑了一番,选择了ThreadPool,我的需求是要拿到线程执行方法的返回值, 但是ThreadPool.QueueUserWorkItem的回调方法默认是没有返回值的,搜 ...

  2. 多线程操作(ThreadPool.QueueUserWorkItem

    主线程: private void GetPolicy_Load(object sender, EventArgs e) { ////ThreadPool.QueueUserWorkItem(new ...

  3. Parallel.ForEach , ThreadPool.QueueUserWorkItem

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题

    ThreadPool是.net System.Threading命名空间下的线程池对象.使用QueueUserWorkItem实现对异步委托的先进先出有序的回调.如果在回调的方法里面发生异常则应用程序 ...

  5. 合理使用线程池 ThreadPool.QueueUserWorkItem()

    //==>自建线程 new Thread(() => { //线程任务 Console.WriteLine(Thread.CurrentThread.ManagedThreadId); } ...

  6. 难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?

    开门见山,下面的例子中通过调用ThreadPool.QueueUserWorkItem(WaitCallback callBack, object state)的方式实现异步调用: 1: class ...

  7. ThreadPool.QueueUserWorkItem 简单示例,显示当前时间

    1.线程池  添加方法 作为一个线程运行 class Program { static void Main(string[] args) { ThreadPool.QueueUserWorkItem( ...

  8. ThreadPool.QueueUserWorkItem的用法

    代码: ThreadPool.SetMaxThreads(, ); ThreadPool.QueueUserWorkItem((obj) => { MessageBox.Show("执 ...

  9. ThreadPool.QueueUserWorkItem的性能问题

    在WEB开发中,为了降低页面等待时间提高用户体验,我们往往会把一些浪费时间的操作放到新线程中在后台执行. 简单的实现代码就是: //代码一 new Thread(()=>{ //do somet ...

随机推荐

  1. Android 校验apk文件渠道号、包名、版本号

    功能:可查看单个或目录下所有apk文件的渠道号.包名.版本号 下载地址:http://download.csdn.net/detail/zgz345/9248487使用:以查看包名.版本号为例 1.c ...

  2. android操作文件

    Android中读取/写入文件的方法,与Java中的I/O是一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件.但是在默认状态下,文件是不能在不同的程 ...

  3. DevExpress 14.2.3源码编译 z

    一.准备 1.准备一台Windows 8.1机器,安装VS2013 2.准备一台Windows 8.1机器,安装VS2010    XP的系统肯定不行,因为有不少的运行库不支持     Windows ...

  4. Android Audio遇到播放无声时的分析

    在Android Audio开发过程中,有遇到播放ringtone时无声,但播放Music可以听到声音,关于无声问题的分析,在此做个笔记,方便以后回顾. 分析方向: 1:在音量控制面板中确认该音频流对 ...

  5. IOS 异步加载图片

    #import <Foundation/Foundation.h> #import "StringUtils.h" @interface ImageManager : ...

  6. 【openstack报错】【因更新包而致】IncompatibleObjectVersion: Version 1.9 of Instance is not supported

    [时间]2014年2月18日 [平台]ubuntu 12.04.3 openstack havana [日志]/var/log/upstart/nova-compute.log  内容如下: ERRO ...

  7. HDU5874:Friends and Enemies

    题目链接: Friends and Enemies 分析: 是一道想法题,我们假设x个人互相敌对,然后有y个人与这x个人都是朋友,而这y个人互相敌对. 则有 x+y=m x*y<=n 举个例子: ...

  8. schedule和scheduleUpdate

    在init()函数里面加上scheduleUpdate(),这样才会每一帧都调用update(). Schedule() 函数有两种方式,一种带时间参数,一种不带时间参数. 带时间参数的,间隔指定时间 ...

  9. html5 canvas图片马赛克

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. centos 安装redis php

    $ wget http://download.redis.io/releases/redis-3.0.7.tar.gz $ tar xzf redis-3.0.7.tar.gz $ cd redis- ...