Sau khi xử lý mẫu không đồng bộ / chờ đợi của C # được một lúc, tôi đột nhiên nhận ra rằng tôi thực sự không biết làm thế nào để giải thích những gì xảy ra trong đoạn mã sau:
async void MyThread()
{
while (!_quit)
{
await GetWorkAsync();
}
}
GetWorkAsync()
được giả định để trả về một sự chờ đợi Task
có thể hoặc có thể không gây ra chuyển đổi luồng khi tiếp tục được thực thi.
Tôi sẽ không bối rối nếu sự chờ đợi không nằm trong một vòng lặp. Tôi tự nhiên mong đợi rằng phần còn lại của phương thức (tức là tiếp tục) có khả năng thực thi trên một luồng khác, điều này là tốt.
Tuy nhiên, trong một vòng lặp, khái niệm "phần còn lại của phương thức" có một chút mù mờ đối với tôi.
Điều gì xảy ra với "phần còn lại của vòng lặp" nếu luồng được bật tiếp tục so với nếu nó không được chuyển đổi? Trên luồng nào là lần lặp tiếp theo của vòng lặp được thực hiện?
Các quan sát của tôi cho thấy (không được xác minh cụ thể) rằng mỗi lần lặp lại bắt đầu trên cùng một luồng (lần đầu tiên) trong khi việc tiếp tục thực hiện trên một lần khác. Điều này thực sự có thể được? Nếu có, đây có phải là một mức độ song song bất ngờ cần được tính đến độ an toàn của luồng vis-a-vis của phương thức GetWorkAsync không?
CẬP NHẬT: Câu hỏi của tôi không phải là một bản sao, như được đề xuất bởi một số người. Mẫu while (!_quit) { ... }
mã chỉ đơn giản là mã hóa mã thực tế của tôi. Trong thực tế, luồng của tôi là một vòng lặp dài xử lý hàng đợi đầu vào của các mục công việc theo các khoảng thời gian đều đặn (cứ sau 5 giây theo mặc định). Kiểm tra điều kiện thoát thực tế cũng không phải là kiểm tra trường đơn giản như được đề xuất bởi mã mẫu, mà là kiểm tra xử lý sự kiện.