Tôi đang gặp vấn đề bế tắc trong một đoạn mã của tôi. Rất may, tôi đã có thể tái tạo vấn đề trong ví dụ dưới đây. Chạy như một ứng dụng Console Net 2.0 thông thường.Điều gì gây ra bế tắc?
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");
}
}
gì tôi mong đợi là chuỗi hoàn chỉnh như sau:
Press any key...
entering worker
entering loop
entering stop
exiting worker
exiting stop
Tuy nhiên, trình tự thực tế quầy hàng trên Thread.Join
gọi:
Press any key...
entering worker
entering stop
Cuối cùng, nếu tôi chèn một sự chậm trễ nhỏ trong cơ thể MainAsync
, mọi thứ đều ổn. Tại sao (nơi) bế tắc xảy ra?
LƯU Ý: trong mã ban đầu tôi đã giải quyết bằng cách sử dụng SemaphoreSlim
thay vì TaskCompletionSource
và hoàn toàn không có vấn đề gì. Tôi chỉ muốn hiểu vấn đề ở đâu.
Bất kỳ lý do nào bạn trộn 'Task's với' Thread's? – Groo
Thay đổi thành 'var tcs = new TaskCompletionSource
@Groo trong mã ban đầu có một chuỗi dài chạy (nhân viên) thực hiện một số công việc mà không cần trộn nhiệm vụ. Tuy nhiên, có một hàm awaitable tiếp xúc để bắt đầu công nhân/thread hoàn thành khi một số công việc ban đầu đã được thực hiện. –