您的位置:首页 > 其它

ThreadPool 线程池 多线程 等待 回调函数 获取返回值

2017-01-13 17:21 615 查看
ThreadPool 出现于2.0时代

线程池:预先准备好线程,少了会补充,多了会销毁多余部分

价值:速度快

基本代码

包含最基本的使用

//多线程
Console.WriteLine("开始");
WaitCallback act = t =>
{
Thread.Sleep(1000);
Console.WriteLine("进入了方法,参数为{0},线程ID{1}", t.ToString(), Thread.CurrentThread.ManagedThreadId);
};

for (int i = 0; i < 5; i++)
{
ThreadPool.QueueUserWorkItem(act, i);
}
Console.WriteLine("结束");

结果



升级版

包含多线程+等待+回调函数+获取返回值

public static Dictionary<int, ManualResetEvent> md = new Dictionary<int, ManualResetEvent>();

public static void Do2()
{
//多线程+等待+回调函数+获取返回值
Console.WriteLine("开始");
WaitCallback wat = t =>
{
string Rval = FirstFun(t);
CallBack();
Console.WriteLine("获取结果为{0}", Rval);
};

//循环实现多线程
for (int i = 0; i < 5; i++)
{
ThreadPool.QueueUserWorkItem(wat, i);
md.Add(i, new ManualResetEvent(false));
}

for (int i = 0; i < md.Count; i++)
{
md[i].WaitOne();
}

Console.WriteLine("结束");
Console.Read();
}

//主方法
public static string FirstFun(object t)
{
Thread.Sleep(1000);
Console.WriteLine("进入方法了,参数{0},线程ID{1}", t.ToString(), Thread.CurrentThread.ManagedThreadId);
md[(int)t].Set();//标记该线程执行完成
return t.ToString();
}
//回调
public static void CallBack()
{
Thread.Sleep(1000);
Console.WriteLine("进入了回调函数,当前线程ID为{0}", Thread.CurrentThread.ManagedThreadId);
}

结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: