上次介紹了 C# 的 async 與 await 語法,這次要來看一個讓 ASP.NET 程式當掉的小實驗。

註:本文摘自《.NET 本事-非同步程式設計》第三章。文中說的「上一節」,指的是上一篇文章

ASP.NET 程式當掉了!

有一條  .NET 非同步程式設計的準則是這麼說的:盡量從頭到尾都一致,亦即一旦使用了非同步呼叫,最好一路都是非同步,而不要中途由非同步呼叫改成同步(阻斷式)呼叫,例如使用 Task.WaitTask.Result,因為那可能會讓你的程式鎖死(當掉)。

這裡參照上一節的 Console 應用程式範例,依樣畫葫蘆,把它改成像底下的 ASP.NET Web API 應用程式,看看結果會怎麼樣。



 1 public class DemoDeadlockController : ApiController
2 {
3 [HttpGet]
4 public HttpResponseMessage DownloadPage()
5 {
6 var task = MyDownloadPageAsync("http://huan-lin.blogspot.com");
7 var content = task.Result;
8 return Request.CreateResponse(string.Format("網頁長度: {0}", content.Length));
9 }
10
11 private async Task<string> MyDownloadPageAsync(string url)
12 {
13 var client = new HttpClient();
14 string content = await client.GetStringAsync(url);
15 return content;
16 }
17 }