【发布时间】:2022-01-13 04:10:59
【问题描述】:
我有一个 ASP.NET Core 3.1 Web API 应用程序,它有一个后台主机服务,我在其中编写了以下代码来模拟应用程序的死锁:
public class Worker : IHostedService
{
public Task StartAsync(CancellationToken cancellationToken)
{
var a = new object();
var b = new object();
lock (a)
{
lock (b)
{
}
}
// other thread
lock (b)
{
lock (a)
{
}
}
return Task.CompletedTask;
}
}
应用程序正在运行,但应用程序不会死锁或挂起状态,我仍然可以访问 web api 端点并且结果返回给我。
是否有可能使正在运行的 Web 应用程序进入死锁或挂起状态,以便 API 的 NONE 给出任何 200 结果?
谢谢。
【问题讨论】:
-
只需添加一个测试,它会产生多个线程,比如 100 并运行 10 分钟,你就会知道答案
-
以其当前形式我会说不,除非你有从不同线程多次调用 StartAsync 的东西......,看到我看到 IHostedService,我猜这是从 1 个线程调用的只有..所以你永远不会有竞争线程..
-
答案很简单
Is deadlock or application hung state possible for ASP.NET Core Web API applicationYES 因为你的意思的范围不够具体,以至于它永远不会,因为它只是语言的一个特征/用法。我认为您应该更改标题,“对于此代码”,如果由多个线程调用,答案是肯定的。 -
@Seabizkit,感谢您的回复。能否请您提供一些示例代码?
-
@user584018 我已经说明了一些事情,1 这不是从网络请求中调用的吗?那么为什么这是问题的一部分,2你正常启动 IHostedService 的方式是在 1 个线程上,所以没有迹象表明它是如何从多个线程调用的。 3 它的表述方式确实构成了一个 gd 问题……也就是说,我是否有可能跳 3 次。 4 可以编写一个测试,但我们离开了 IHostedServic。就像操作的真正问题一样,是什么让您认为这是由多个线程调用的?别管实际的问题。
标签: c# asp.net-core-webapi deadlock