多线程(5)async&await
.net 4.0的Task已经让我们可以非常简单地使用多线程,并且可以有返回值,也可以支持线程的取消等操作,可谓已经很强大了。但.net 4.5为我们带来了async&await,使得实现多线程的写法更简单,更优美,更符合线性思维。
下面通过一个例子来演示通过Task和async&await分别如何实现,并且最后还附上代码执行顺序图。
使用Task实现
如下代码:
1 #region 使用Task实现
2 static void TestByTask()
3 {
4 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
5 var task = Task.Factory.StartNew<string>(() =>
6 {
7 return GetNameByTask();
8 });
9 Console.WriteLine("get another thread result,result:" + task.Result);
10 Console.WriteLine("main thread completed!");
11 }
12
13 static string GetNameByTask()
14 {
15 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
16 return "mcgrady";
17 }
18 #endregion
输出结果:

使用async&await实现
假如使用async&await如何实现呢,如下代码:
1 #region 使用async&await实现
2 static async void TestByAsyncAwait()
3 {
4 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
5 var name = GetNameByAsyncAwait();
6
7 Console.WriteLine(string.Format("get another thread result,result:{0}", await name));
8 Console.WriteLine("main thread completed!");
9 }
10
11 static async Task<string> GetNameByAsyncAwait()
12 {
13 return await Task.Factory.StartNew<string>(() =>
14 {
15 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
16 return "mcgrady";
17 });
18 }
19 #endregion
输出结果:

输出结果跟使用Task相同。
代码执行流程如下图:

完整代码:
View Code
漫思

浙公网安备 33010602011771号