一、线程池(ThreadPool)
.NETFramework 2.0。如果某个对象创建和销毁的代价比较高,同时这个对象还可以反复使用,就需要一个线程池。在需要用到的时候直接从线程池里面拿,用完了之后不用销毁,放回线程池里面。
二、启动线程
//开启线程,执行委托,不带参数
ThreadPool.QueueUserWorkItem(s => this.Todo("ThreadPoolMethod"));
//开启线程,执行委托,带参数
ThreadPool.QueueUserWorkItem(s => this.Todo("ThreadPoolMethod"), "小梅");
三、等待之后,在执行后面的操作
ManualResetEvent mre = new ManualResetEvent(false); //false 关闭
ThreadPool.QueueUserWorkItem(s =>
{
this.Todo("ThreadPoolMethod");
mre.Set(); //打开
});
Console.WriteLine("正在执行中................");
Console.WriteLine("正在执行中................");
Console.WriteLine("正在执行中................");
Console.WriteLine("正在执行中................");
mre.WaitOne(); //等待执行完了之后在玩下执行,会阻塞
Console.WriteLine("执行完了.........");
四、回调
private void ThreadPoolCallBack(WaitCallback waitCallback, Action action)
{
ThreadPool.QueueUserWorkItem(s =>
{
waitCallback.Invoke("");
action.Invoke();
}, "");
}
Action action = () => this.Todo("ThreadPoolCallBack");
WaitCallback waitCallback = s =>
{
Console.WriteLine("回调函数开始了");
};
ThreadPoolCallBack(waitCallback, action);
五、委托异步方法获取返回值
private Func<T> ThreadPoolReturn<T>(Func<T> func)
{
T t = default(T);
ManualResetEvent mre = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(s =>
{
t = func.Invoke();
mre.Set();
});
return new Func<T>(() =>
{
mre.WaitOne();
return t;
});
}
Func<int> func = () =>
{
return DateTime.Now.Year;
};
var threadPoolReturn = ThreadPoolReturn(func);
int result = threadPoolReturn.Invoke();
Console.WriteLine(result);
private void Todo(string name)
{
Console.WriteLine($"Todo 方法开始执行....");
long result = 0;
for (int i = 0; i < 100000; i++)
{
result += i;
}
Thread.Sleep(500);
Console.WriteLine($"Todo方法执行的结果:{result},名称{name},ManagedThreadId:{Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine($"Todo 方法结束执行....");
}