5
저는 코드 조각에 교착 상태가 발생했습니다. 고맙게도, 나는 아래 예제에서 문제를 재현 할 수있었습니다. 정상적인 .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 stop
마지막 :
Press any key...
entering worker
entering loop
entering stop
exiting worker
exiting stop
그러나, 실제 시퀀스가 Thread.Join
통화 포장 마차
MainAsync
본문에 작은 지연, 모든게 잘 간다. 교착 상태가 발생하는 이유는 무엇입니까?
참고 : 원래 코드에서 TaskCompletionSource
대신 SemaphoreSlim
을 사용하여 해결했으며 전혀 문제가 없습니다. 문제가있는 곳만 이해하고 싶습니다.
'작업'과'스레드'를 섞어서 사용하는 이유는 무엇입니까? – Groo
'var tcs = new TaskCompletionSource