gpt4 book ai didi

c# - 是什么导致了僵局?

转载 作者:太空狗 更新时间:2023-10-29 23:28:44 26 4
gpt4 key购买 nike

<分区>

我在我的一段代码中遇到了死锁问题。值得庆幸的是,我已经能够在下面的示例中重现该问题。作为普通的 .Net Core 2.0 控制台应用程序运行。

class Class2
{

static void Main(string[] args)
{
Task.Run(MainAsync);
Console.WriteLine("Press any key...");
Console.ReadKey();
}

static async Task MainAsync()
{
await StartAsync();
//await Task.Delay(1); //a little delay makes it working
Stop();
}


static async Task StartAsync()
{
var tcs = new TaskCompletionSource<object>();
StartCore(tcs);
await tcs.Task;
}


static void StartCore(TaskCompletionSource<object> tcs)
{
_cts = new CancellationTokenSource();
_thread = new Thread(Worker);
_thread.Start(tcs);
}


static Thread _thread;
static CancellationTokenSource _cts;


static void Worker(object state)
{
Console.WriteLine("entering worker");
Thread.Sleep(100); //some work

var tcs = (TaskCompletionSource<object>)state;
tcs.SetResult(null);

Console.WriteLine("entering loop");
while (_cts.IsCancellationRequested == false)
{
Thread.Sleep(100); //some work
}
Console.WriteLine("exiting worker");
}


static void Stop()
{
Console.WriteLine("entering stop");
_cts.Cancel();
_thread.Join();
Console.WriteLine("exiting stop");
}

}

我期望的是完整的序列如下:

Press any key...
entering worker
entering loop
entering stop
exiting worker
exiting stop

但是,实际序列在 Thread.Join 调用时停止:

Press any key...
entering worker
entering stop

最后,如果我在 MainAsync 主体中插入一个小的延迟,一切都会顺利进行。为什么(在哪里)发生死锁?

注意:在原始代码中,我使用 SemaphoreSlim 而不是 TaskCompletionSource 解决了问题,完全没有问题。我只想了解问题出在哪里。

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