Ban đầu tôi nghĩ rằng tất cả các lần tiếp tục được thực thi trên luồng (được đưa ra một bối cảnh đồng bộ hóa mặc định). Tuy nhiên điều này dường như không xảy ra khi tôi sử dụng TaskCompletionSource
.Trong trường hợp nào TaskCompletionSource.SetResult() chạy liên tục đồng bộ?
Mã của tôi trông giống như sau:
Task<int> Foo() {
_tcs = new TaskCompletionSource<int>();
return _tcs.Task;
}
async void Bar() {
Console.WriteLine(Thread.Current.ManagedThreadId);
Console.WriteLine($"{Thread.Current.ManagedThreadId} - {await Foo()}");
}
Bar
được gọi bằng một sợi chỉ cụ thể và TaskCompletionSource
vẫn unset trong một thời gian, có nghĩa là nhiệm vụ trở IsComplete = false
. Sau đó, sau một thời gian, cùng một luồng sẽ tiến hành gọi _tcs.SetResult(x)
, theo sự hiểu biết của tôi nên chạy phần tiếp tục trên luồng. Tuy nhiên, những gì tôi quan sát thấy trong ứng dụng của tôi là luồng chạy tiếp tục trên thực tế vẫn là cùng một luồng, như thể việc tiếp tục được gọi đồng bộ ngay khi SetResult
được gọi.
Tôi thậm chí đã thử thiết lập một điểm ngắt trên SetResult
và bước qua nó (và có điểm ngắt trong phần tiếp theo), mà đến lượt nó thực sự tiếp tục gọi sự tiếp tục đồng bộ.
Khi nào chính xác thì SetResult()
ngay lập tức gọi tiếp tục đồng bộ?
Sẽ giúp ích nếu bạn cung cấp [mcve] thay vì * nửa * của nó, vì vậy chúng tôi có thể thử nghiệm với chính nó ... –