如何在MVC4中监视async / await死锁?

时间:2013-04-01 15:29:31

标签: .net multithreading asynchronous monitoring async-await

阅读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的网站,我该如何设置潜在死锁的监控?

谢谢!

1 个答案:

答案 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.");
}