多线程(5)async&await

时间:2023-03-09 17:45:33
多线程(5)async&await

  .net 4.0的Task已经让我们可以非常简单地使用多线程,并且可以有返回值,也可以支持线程的取消等操作,可谓已经很强大了。但.net 4.5为我们带来了async&await,使得实现多线程的写法更简单,更优美,更符合线性思维。

下面通过一个例子来演示通过Task和async&await分别如何实现,并且最后还附上代码执行顺序图。

使用Task实现

如下代码:

 #region 使用Task实现
static void TestByTask()
{
Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
var task = Task.Factory.StartNew<string>(() =>
{
return GetNameByTask();
});
Console.WriteLine("get another thread result,result:" + task.Result);
Console.WriteLine("main thread completed!");
} static string GetNameByTask()
{
Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
return "mcgrady";
}
#endregion

输出结果:

多线程(5)async&await

使用async&await实现

假如使用async&await如何实现呢,如下代码:

 #region 使用async&await实现
static async void TestByAsyncAwait()
{
Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
var name = GetNameByAsyncAwait(); Console.WriteLine(string.Format("get another thread result,result:{0}", await name));
Console.WriteLine("main thread completed!");
} static async Task<string> GetNameByAsyncAwait()
{
return await Task.Factory.StartNew<string>(() =>
{
Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
return "mcgrady";
});
}
#endregion

输出结果:

多线程(5)async&await

输出结果跟使用Task相同。

代码执行流程如下图:

多线程(5)async&await

完整代码:

 namespace ConsoleApplication25
{
class Program
{
static void Main(string[] args)
{
//1,使用task实现
//TestByTask(); //2,使用async&await实现
TestByAsyncAwait(); Console.ReadKey();
} #region 使用Task实现
static void TestByTask()
{
Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
var task = Task.Factory.StartNew<string>(() =>
{
return GetNameByTask();
});
Console.WriteLine("get another thread result,result:" + task.Result);
Console.WriteLine("main thread completed!");
} static string GetNameByTask()
{
Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
return "mcgrady";
}
#endregion #region 使用async&await实现
static async void TestByAsyncAwait()
{
Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
var name = GetNameByAsyncAwait(); Console.WriteLine(string.Format("get another thread result,result:{0}", await name));
Console.WriteLine("main thread completed!");
} static async Task<string> GetNameByAsyncAwait()
{
return await Task.Factory.StartNew<string>(() =>
{
Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
return "mcgrady";
});
}
#endregion
}
}