Trả lời

9

Đôi khi bạn nhận được Tác vụ từ bên ngoài và muốn kết nối chuỗi liên kết của bạn với bên ngoài. Ngoài ra còn có các cách để tạo tác vụ không có Hành động (ví dụ: sử dụng TaskCompletionSource).

5

continuations công tác cho phép bạn chuỗi Nhiệm vụ, mỗi nhiệm vụ trong chuỗi được theo sau là một nhiệm vụ khác

Cũng trong Task.ContinueWith phương pháp mà bạn không đồng bộ có thể kiểm tra Task với TaskContinuationOptions khi mục tiêu Task hoàn thành hoặc một lỗi xảy ra

Task task = Task.Factory.StartNew 
(
    () => 
     { 
      //Your action when the task started 
     } 
); 

task.ContinueWith 
(
    _ => 
     { 
      //Your action when the task completed 
     }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

task.ContinueWith 
(
    (t) => 
     { 
      //Action when error occured 
      Exception exception = null; 

      if (t.Exception.InnerException != null) 
      { 
      exception = t.Exception.InnerException; 
      } 
      else 
      { 
      exception = t.Exception; 
      } 

      //You can use this exception 
     }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

Để biết thêm thông tin tìm kiếm câu trả lời here

10

Sasha Goldshtein là đúng. Có những trường hợp mã thành phần 'tiếp tục' của bạn không có quyền truy cập trực tiếp, hoặc thậm chí đặt phương thức thực thi của tác vụ. Ví dụ, một hệ thống có thể cắm được để tổng hợp taks.

Tuy nhiên, có một lý do khác có thể áp dụng. Granularity

Xem xét các yêu cầu có thể kích động việc sử dụng TaskCreationOptions.LongRunning. Trong một hệ thống song song, nơi có hàng trăm tiến trình đang được lên kế hoạch, được thực hiện và hoàn thành, công cụ lên lịch tác vụ đang làm việc để thúc đẩy mối quan hệ bộ xử lý hiệu quả khi lên lịch các tác vụ.

Nếu bạn đang ở trong tình huống mà bạn có thể chia nhiệm vụ thành các nhiệm vụ phụ chi tiết và chuỗi chúng, bạn sẽ không còn cần phải sử dụng TaskCreationOptions.LongRunning. Nói một cách đơn giản, điều này sẽ hoạt động tốt hơn vì dễ dàng lên lịch 100 nhiệm vụ nhỏ để hoàn thành cùng một lúc, hơn là lên lịch 10 nhiệm vụ lớn để thực hiện tương tự trong môi trường chỉ có 4 lõi. Hãy nhớ rằng một nhiệm vụ xích không được đảm bảo để bắt đầu ngay sau khi nó là tiền lệ.

Đây là một câu hỏi thú vị và một câu hỏi chỉ trở thành vấn đề khi bạn muốn có một hệ thống có thể mở rộng.

Nếu bạn hỏi tôi, bạn nên sử dụng ContinueWith() nếu có thể vì nó sẽ giúp quy mô ứng dụng của bạn.

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