2013-04-01 58 views
4

閱讀之後Best Practices in Asynchronous Programming 我決定測試MVC4中的死鎖行爲。來自Intranet模板創建的網站後,我修改了索引操作是這樣的:如何監視MVC4中的異步/等待死鎖?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Web; 
using System.Web.Mvc; 

namespace AsyncAwait.MVC4.Controllers 
{ 
    public class HomeController : Controller 
    { 
     private static async Task DelayAsync() 
     { 
      await Task.Delay(1000); 
     } 

     // This method causes a deadlock when called in a GUI or ASP.NET context. 
     public static void Test() 
     { 
      // Start the delay. 
      var delayTask = DelayAsync(); 
      // Wait for the delay to complete. 
      delayTask.Wait(); 
     } 

     public ActionResult Index() 
     { 
      ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; 

      Test(); 

      return View(); 
     } 
    } 
} 

到指數的調用如我所料,但我也期待一個例外,在某些時候被拋出掛起。異常不會被拋出,所有請求都會掛起。

我查看了所有可用的性能計數器,但無法弄清楚如何識別死鎖。如果我要與使用異步/等待的現有網站合作,如何設置潛在的死鎖監控?

謝謝!

+2

爲什麼你會期望死鎖拋出異常? – svick

+0

@svick:你是對的,我不應該期待一個例外,誤讀我引用的文章。不過,我想知道是否有可能以某種方式監控死鎖。謝謝! –

+1

偉大的問題。我認爲這更多地涉及多線程,而不是直接與異步/等待設施相關。我認爲你唯一的選擇是設計某種形式的監控。我不知道使用C#或運行時的自動行爲。 –

回答

0

如果您希望在可預測的時間範圍內完成任務,那麼您可以使用超時。

Task.Wait有幾個重載需要超時值。

例如,如果你的任務不應該超過5秒鐘,你可以做這樣的事情。

var delayTask = DelayAsync(); 

// Will be true if DelayAsync() completes within 5 seconds, otherwise false. 
bool callCompleted = delayTask.Wait(TimeSpan.FromSeconds(5)); 

if (!callCompleted) 
{ 
    throw new TimeoutException("Task not completed within expected time."); 
} 
+0

謝謝!這絕對是其中一種方法。不過,我希望看到在修復任何代碼之前,是否有可能在現有應用程序中觀察到死鎖。 –