今天花一點時間學一下非同步。
.NET 1.0 就有提供非同步的功能。而現成我們 C# 程式中常看到的非同步,是使用 .NET 4.0 提供的非同步 API -- Task Parallel Library (TPL),其核心非同步的管理方式,是基於任務的非同步模式-- Task-based Asynchronous Pattern (TAP)。
其 Library 提供的 Task
類別,代表一個非同步工作的封裝。執行過程由 Library 內的工作排程器控制,來決定如何分配thread
。
當我們要做的事情,包進 Task
裡,讓 Task
來執行(Start),就代表有使用到 執行緒
。
使之主程式 Main()
用的執行序,跟Task
用的執行序不同。
以下是範例程式。
void Main()
{
var task = new Task(MyTask);
task.Start();
for (int i = 0; i < 500; i++)
{
Console.Write('.');
}
}
void MyTask()
{
for (int i = 0; i < 500; i++)
{
Console.Write('[' + Thread.CurrentThread.ManagedThreadId + ']');
}
}
以下是執行結果,每次按 F5 的結果都會不一樣,可以看到,電腦做到一半,就會切換執行緒執行。何時切換,切換幾次才會全部執行完,都是不一定。
不另外寫一個方法,而是直接寫個匿名方法給Task.Run()
立即執行也是可以。
var task = Task.Run(() =>
{
for (int i = 0; i < 500; i++)
{
Console.Write('[' + Thread.CurrentThread.ManagedThreadId + ']');
}
});
for (int i = 0; i < 500; i++)
{
Console.Write('.');
}
參考資料
《.NET 本事 - 非同步程式設計》