Làm thế nào để có được chủ đề đang chờ đợi. Ngủ?


139

Tôi đang viết một ứng dụng giới hạn mạng dựa trên mô hình chờ / ngủ.

Đôi khi, lỗi kết nối xảy ra và theo kinh nghiệm của tôi, nó trả tiền để chờ một thời gian và sau đó thử lại hoạt động.

Vấn đề là nếu tôi sử dụng Thread.S ngủ hoặc một hoạt động chặn tương tự khác trong await / async, nó sẽ chặn tất cả hoạt động trong luồng của người gọi.

Tôi nên thay thế Thread.S ngủ (10000) bằng gì để đạt được hiệu quả tương tự như

await Thread.SleepAsync(10000)

?

CẬP NHẬT

Tôi sẽ thích một câu trả lời mà không cần tạo thêm bất kỳ chủ đề nào

Câu trả lời:


323

Các câu trả lời khác cho thấy bắt đầu một chủ đề mới là một ý tưởng tồi - không cần phải làm điều đó cả. Một phần của điểm async/ awaitlà để giảm số lượng chủ đề mà ứng dụng của bạn cần.

Thay vào đó, bạn nên sử dụng Task.Delaykhông yêu cầu một chủ đề mới và được thiết kế chính xác cho mục đích này:

// Execution of the async method will continue one second later, but without
// blocking.
await Task.Delay(1000);

Tôi vẫn đang nắm bắt được công cụ a4.5. Đâu là nhánh thực thi mã sau câu lệnh đó? Phần không ngủ / chặn thực thi nó hay 'luồng' chờ? Có phải thực thi không chặn chính chỉ rời khỏi khối sau (còn gọi là return) không?
kenny

1
vâng Đây là chính xác những gì tôi cần
Arsen Zahray

1
@kenny: Bạn có thể thấy asyncphần giới thiệu của tôi hữu ích. Khi awaitable trả về bởi Task.Delayđang awaited, vì nó chưa hoàn chỉnh, các phương pháp hiện hành trả về một nhiệm vụ không đầy đủ. Sau đó, khi Delayhoàn thành (tắt bộ đếm thời gian, không phải luồng), phần còn lại của phương thức được lên lịch để chạy. Việc tiếp tục chạy trong một "bối cảnh" có thể trở lại cùng một chủ đề ban đầu - chi tiết trên blog của tôi.
Stephen Cleary

@StephenCleary cảm ơn vì điều đó. Vì vậy, tôi có đúng không khi nói rằng mã sau khi chờ đợi là 'được lên lịch' để thực thi và trả về chuỗi cuộc gọi?
kenny

2
Có, chuỗi cuộc gọi trả về (ngay lập tức) và mã sau khi awaitđược lên lịch (cuối cùng).
Stephen Cleary
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.