上一篇講到了.Net4.5新增的async和await關鍵字,其實async和await算是一組标記,真正實作異步操作的是Task新開的任務線程。
什麼是Task
Task是.Net4.0新增用來處理異步程式設計的,叫做基于“任務程式設計模型”,任務其實是架構線上程之上的,具體操作的時候還是由線程去執行的,任務的管控有點類似于線程池,程式中開10個Task,不一定對應的要開10個線程,他們并不是一一對應的關系。
-
建立Task
建立Task有兩種方式,一種是直接執行個體化,另一種是使用任務工廠生成。
Task<int> ts = new Task<int>(TaskTest, 100);
public static int TaskTest(object state)
{
int data = (int)state;
int sum = 0;
for (int i = 0; i < data; i++)
{
sum++;
}
return sum;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
這裡第一個參數為方法委托,可以直接傳入要執行的方法名,值得注意的是這個方法的參數類型為object,若改為int,會編譯不過,具體可去檢視Task的構造函數的參數類型。
當然也可以用Lamda表達式
Task<int> ts = new Task<int>((state) =>
{
int data = (int)state;
int sum = 0;
for (int i = 0; i < data; i++)
{
sum++;
}
return sum;
},10);
ts.Start();
執行個體化的Task對象,必須用Start方法啟動。
第二種用任務工廠直接建立的無需用Start方法啟動執行,建立後就會執行
Task<int> task = Task.Factory.StartNew<int>(
(state) =>
{
int data = (int)state;
int sum = 0;
for (int i = 0; i < data; i++)
{
sum++;
}
return sum;
}, 10);
static void Main(string[] args)
{
Task<int> ts1 = new Task<int>(() => {
return 100;
});
ts1.Start();
var re = ts1.ContinueWith<int>((task) => {
return task.Result + 200;
});
Console.WriteLine("執行結果:"+re.Result);
Console.ReadLine();
}
Task.Factory.StartNew<int>(() => { return 100; }).ContinueWith<int>(ts =>
{
return ts.Result + 200;
}).ContinueWith(task => {
Console.WriteLine("執行結果:" + task.Result);
});
Console.ReadLine();