阅读Best Practices in Asynchronous Programming后 我决定测试MVC4中的死锁行为。从Intranet模板创建网站后,我修改了索引操作,如下所示:
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的网站,我该如何设置潜在死锁的监控?
谢谢!
答案 0 :(得分: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.");
}