gpt4 book ai didi

.net - 如何监控 MVC4 中的异步/等待死锁?

转载 作者:行者123 更新时间:2023-12-05 01:23:49 25 4
gpt4 key购买 nike

阅读后Best Practices in Asynchronous Programming
我决定测试 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 的现有网站,我该如何设置对潜在死锁的监控?

谢谢!

最佳答案

如果您希望您的任务在可预测的时间范围内完成,那么您可以使用超时。
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.");
}

关于.net - 如何监控 MVC4 中的异步/等待死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15746322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com