非同期プログラミングのベスト プラクティスを読んだ後 、MVC4 でデッドロックの動作をテストすることにしました。イントラネット テンプレートから Web サイトを作成した後、Index アクションを次のように変更しました。
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();
}
}
}
Index の呼び出しは予期したとおりにハングしますが、ある時点で例外がスローされることも予期していました。ただし、例外がスローされることはなく、すべてのリクエストがハングするだけです。
利用可能なすべてのパフォーマンス カウンターを調べましたが、デッドロックを特定する方法がわかりませんでした。async/await を使用する既存の Web サイトで作業する場合、潜在的なデッドロックの監視をどのようにセットアップできますか?
ありがとう!