Is deadlock or application hung state possible for ASP.NET Core Web API application(ASP.NET Core Web API应用程序是否可能处于死锁或应用程序挂起状态)
问题描述
我有一个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都不会给出任何200个结果?
谢谢。
推荐答案
按照编写,当前方法永远不会死锁。
锁对象是该方法的本地对象。正确的锁定必须使用方法作用域之外的对象。
在下面的修订中,锁对象是类的静电,并且锁定添加了微小的延迟来模拟正在执行的工作。在此方案中,应用程序将在方法的第二个入口时死锁。
public class Worker
{
private static readonly object _a = new();
private static readonly object _b = new();
private const int _delay = 5;
public Task StartAsync2( int n )
{
lock( _a )
{
Console.WriteLine( $"{n}: _a1 enter" );
lock( _b )
{
Console.WriteLine( $"{n}: _b1 enter" );
Thread.Sleep( _delay );
}
Console.WriteLine( $"{n}: _b1 exit" );
}
Console.WriteLine( $"{n}: _a1 exit" );
// other thread
lock( _b )
{
Console.WriteLine( $"{n}: _b2 enter" );
lock( _a )
{
Console.WriteLine( $"{n}: _a2 enter" );
Thread.Sleep( _delay );
}
Console.WriteLine( $"{n}: _a2 exit" );
}
Console.WriteLine( $"{n}: _b2 exit" );
return Task.CompletedTask;
}
}
下面介绍如何执行Worker以导致死锁:
var w = new Worker();
var t = new Task[5];
for( int i = 0; i < t.Length; i++ )
{
int n = i;
t[i] = Task.Run( () =>
{
Console.WriteLine( $"{n} start" );
w.StartAsync2( n );
Console.WriteLine( $"{n} end" );
return Task.CompletedTask;
} );
}
Task.WaitAll( t );
这篇关于ASP.NET Core Web API应用程序是否可能处于死锁或应用程序挂起状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:ASP.NET Core Web API应用程序是否可能处于死锁或应用程序挂起状态
基础教程推荐
- 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
- JSON.NET 中基于属性的类型解析 2022-01-01
- 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
- 如何动态获取文本框中datagridview列的总和 2022-01-01
- 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
- 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
- 全局 ASAX - 获取服务器名称 2022-01-01
- 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
- 错误“此流不支持搜索操作"在 C# 中 2022-01-01
- 首先创建代码,多对多,关联表中的附加字段 2022-01-01
