多執行緒---ThreadPool理解(三)
阿新 • • 發佈:2020-12-13
一、執行緒池(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 方法結束執行....");
}