6

Ai đó có thể giải thích cho tôi về việc sử dụng quá tải Task.Wait (CancellationToken) không? MSDN không nói nhiều về nó ...Task.Wait Method (CancellationToken)

Đây là cách tôi thường xử lý hủy nhiệm vụ:

 var source = new CancellationTokenSource(); 
     var task = Task.Factory.StartNew(() => 
     { 
      while (true) 
      { 
       source.Token.ThrowIfCancellationRequested(); 
      } 
     }, source.Token); 

     try 
     { 
      task.Wait(); 
     } 
     catch (AggregateException exc) 
     { 
      exc.Flatten().Handle(e => e is OperationCanceledException); 
     } 

Vì vậy, khi là nó hữu ích để vượt qua các dấu hiệu để các phương pháp Chờ?

Trả lời

13

Hãy xem xét trường hợp bạn muốn hủy bỏ chờ cho công việc, mà không thực sự hủy nhiệm vụ riêng của mình ... hoặc vì nhiệm vụ không xử lý hủy chính nó, hoặc bởi vì bạn thực sự muốn tiếp tục đi với tác vụ, nhưng (nói) trả lời người dùng bằng "Quá trình này mất một lúc ... nhưng vẫn đang diễn ra. Thật an toàn khi đóng trình duyệt của bạn." (Hoặc bất cứ điều gì.)

+0

Cảm ơn, đã tìm thấy câu trả lời trong một bài báo, xem bình luận của tôi dưới đây. – Tsef

3

Các mặt hàng này trong một tờ giấy trắng Microsoft:

Nó cũng là thú vị cần lưu ý sự tồn tại của một tình trạng quá tải cho Task.Wait() mà phải mất một CancellationToken với chữ ký Task.Wait (CancellationToken). Quá tải này mất một mã thông báo để chờ đợi có thể bị hủy bỏ; tình trạng quá tải này không liên quan gì đến việc hủy nhiệm vụ, nhưng thay vào đó nó có thể làm cho sự chờ đợi trở lại sớm. Nếu Task.Wait (ct) được sử dụng và chờ đợi bị gián đoạn vì nó phát hiện mã thông báo đã được báo hiệu, thì một OperationCanceledException (ct) sẽ được ném ra để cho biết rằng hoạt động chờ đã bị hủy.

+1

Đó không phải là câu trả lời chính xác của tôi, về cơ bản? "Xem xét trường hợp bạn muốn hủy chờ nhiệm vụ" –

+0

xin lỗi, trường hợp này đã bị bỏ đánh dấu do nhầm lẫn. thay đổi nó trở lại. – Tsef