ASP.NET 程式鎖死與 SynchronizationContext

上次介紹了 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 }


Copyright © 2012. Huan-Lin 學習筆記 - All Rights Reserved
Powered by Blogger
Template Design by Cool Blogger Tutorials
Published by Templates Doctor