C#异步Async、Task、Await
参考http://www.cnblogs.com/jesse2013/p/async-and-await.html
事例:
static void Main(string[] args) { for (int i = 0; i < 4; i++) { TestAsync(); } Console.ReadLine(); } static async Task TestAsync() { Console.WriteLine("Test()开始, Thread Id: {0}\r\n", Thread.CurrentThread.ManagedThreadId); var name = GetNameAsync(); //我们这里没有用 await,所以下面的代码可以继续执行 // 但是如果上面是 await GetNameAsync(),下面的代码就不会立即执行,输出结果就不一样了。
var res = await name; // Console.WriteLine("await GetName1: {0},得到结果进行其它操作", res ); Console.WriteLine("Test()结束.\r\n");
} static async Task<string> GetNameAsync() { // 这里还是主线程 Console.WriteLine("GetName()开始, thread Id is: {0}", Thread.CurrentThread.ManagedThreadId); return await Task.Run(() => { Thread.Sleep(1000); Console.WriteLine("'GetName' Thread Id: {0}", Thread.CurrentThread.ManagedThreadId); return "Jesse"; }); }
、、、、
static async Task Test(){ Task<string> task = Task.Run(() =>{ Console.WriteLine("另一个线程在运行!"); // 这句话只会被执行一次 Thread.Sleep(2000); return "Hello World"; }); // 这里主线程会挂起等待,直到task执行完毕我们拿到返回结果 var result = task.GetAwaiter().GetResult(); // 这里不会挂起等待,因为task已经执行完了,我们可以直接拿到结果 var result2 = await task; Console.WriteLine(str); }