C# async
/ await
的用法
🏷️ C#
使用 async
/ await
关键字可以方便的实现异步的效果。
示例代码:
cs
using System;
using System.Threading;
using System.Threading.Tasks;
namespace AsyncSample
{
class Program
{
static void Main(string args)
{
Console.WriteLine("Main Start.(ThreadId:{0})", Thread.CurrentThread.ManagedThreadId);
PrintAsyncThreadInfo(); // 这里不会阻塞线程
Console.WriteLine("Main End.(ThreadId:{0})", Thread.CurrentThread.ManagedThreadId);
Console.ReadLine();
}
static async void PrintAsyncThreadInfo()
{
Console.WriteLine("PrintAsyncThreadInfo Start.(ThreadId:{0})", Thread.CurrentThread.ManagedThreadId);
await PrintAwaitThreadInfo(); // 新起一个线程执行 Task
// 之后的方法被封装成代理,Task 结束后再调用
Console.WriteLine("PrintAsyncThreadInfo End.(ThreadId:{0})", Thread.CurrentThread.ManagedThreadId);
}
static Task PrintAwaitThreadInfo()
{
return Task.Run(() => {
Console.WriteLine("PrintAwaitThreadInfo Start.(ThreadId:{0})", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("PrintAwaitThreadInfo End.(ThreadId:{0})", Thread.CurrentThread.ManagedThreadId);
});
}
}
}
输出结果:
Main Start.(ThreadId:1)
PrintAsyncThreadInfo Start.(ThreadId:1)
PrintAwaitThreadInfo Start.(ThreadId:3)
PrintAwaitThreadInfo End.(ThreadId:3)
Main End.(ThreadId:1)
PrintAsyncThreadInfo End.(ThreadId:3)
由上面的输出可以发现:
Main
方法的 Start 和 End 的线程 ID 为 1;PrintAwaitThreadInfo
的 Start 和 End 的线程 ID 为 3;PrintAsyncThreadInfo
的 Start 线程 ID 为 1,End 线程 ID 为 3;
可以说明 await
关键字调用的方法及之后的处理是在新线程中执行的;
Main 的 End 在 PrintAsyncThreadInfo
的 End 之前执行说明 await
关键字不阻塞线程;