4

在阅读了异步编程的最佳实践之后, 我决定测试 MVC4 中的死锁行为。从 Intranet 模板创建网站后,我修改了 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 的现有网站,我该如何设置对潜在死锁的监控?

谢谢!

4

1 回答 1

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.");
}
于 2013-04-01T17:57:32.747 回答