2016-04-22 17 views
14

Tôi đã tự hỏi cách viết/mã không đồng bộ tốt nhất/chính xác bao gồm hai (hoặc nhiều) không đồng bộ và phụ thuộc (thao tác đầu tiên phải kết thúc để thực hiện giây).Tuần tự chờ đợi VS Tiếp tục chờ

Ví dụ với async/chờ:

await RunFirstOperationAsync(); 
await RunSecondOperationAsync(); 

Ví dụ với Tiếp tục:

await RunFirstOperationAsync() 
    .ContinueWith(t => RunSecondOperationAsync()); 
+2

Nhìn vào [this] (http://stackoverflow.com/questions/8767218/is-async-await-keyword-equivalent-to-a-continuewith-lambda) SO thảo luận –

Trả lời

15

Bạn muốn sử dụng await nếu bạn có thể.

ContinueWith có một số vấn đề. Tôi mô tả ngắn gọn trong bài đăng trên blog của tôi trên why ContinueWith is dangerous, được xây dựng trên bài đăng blog trước của tôi trên why StartNew is dangerous (họ chia sẻ nhiều vấn đề tương tự).

Đặc biệt:

  • ContinueWith không có một mặc định tốt TaskScheduler. Trình lên lịch tác vụ mặc định là TaskScheduler.Current (không phải TaskScheduler.Default) và tiếp tục trên SynchronizationContext hiện tại phải được thực hiện thủ công nếu muốn.
  • ContinueWith có mặc định không lý tưởng options. Đối với mã không đồng bộ, bạn muốn ít nhất DenyChildAttachExecuteSynchronously.
  • ContinueWith không hiểu các lần tiếp tục không đồng bộ, thường yêu cầu thêm Unwrap cuộc gọi để giải quyết giới hạn này.
  • ContinueWith xử lý đối số CancellationToken một cách đáng ngạc nhiên. Thêm vào đó in this blog post của tôi.

Các đối số này đều được tóm tắt trên số blog post on Task continuations của tôi. await không có bất kỳ hạn chế nào.

Các vấn đề liên quan