2012-01-11 15 views
11

Tôi có một câu hỏi đơn giản, tôi có sau Parallel đơn giản cho vòng lặp. điều này cho vòng lặp là một phần của dịch vụ windows. Tôi muốn dừng vòng lặp, khi ai đó ngừng dịch vụ. Tôi có thể tìm thấy ba cách để dừng song song, đó là trong điều kiện. Cách tốt nhất để ngăn chặn song song cho vòng lặp là gì và sự khác biệt là gì?Sự khác biệt giữa loopstate.Break(), loopState.Stop() và CancellationTokenSource.Cancel()

 CancellationTokenSource cancellationToken = new CancellationTokenSource(); 
     ParallelOptions options = new ParallelOptions(); 
     options.CancellationToken = cancellationToken.Token; 

     Parallel.For(0, maximum_operations, options, (a, loopState) => 
     { 
      { 
       //Do something 

       if(!KeepProcessing) 
       { 
        //loopState.Break(); 
        //loopState.Stop(); 
        cancellationToken.Cancel(); 

       } 
      } 
     }); 

Trả lời

15

CancellationToken được sử dụng để hủy tín hiệu.

loopState.Break()loopState.Stop() được sử dụng để thực hiện kết thúc.

Dưới đây là một ví dụ

Parallel.For(0, maximum_operations, options, (a, loopState) => 
    { 
     // do work 

     // cancellationToken.Cancel() should be called externally 
     if(token.IsCancellationRequested) 
     { 
      // cancellation requested - perform cleanup work if necessary 

      // then call 
      loopState.Break(); 
      // or 
      loopState.Stop(); 
     } 
    }); 

loopState.Break() nghĩa hoàn chỉnh tất cả các lần lặp trên tất cả các chủ đề mà trước khi lặp hiện hành về xử lí hiện tại, và sau đó thoát khỏi vòng lặp (MSDN).

loopState.Stop() có nghĩa là dừng tất cả các lần lặp lại ngay sau khi thuận tiện (MSDN).


Một cách khác để chấm dứt thực hiện là gọi token.ThrowIfCancellationRequested(), nhưng bạn sẽ cần phải xử lý các OperationCanceledException ngoại lệ:

public void MyMethod() 
{ 
    try 
    { 
     Parallel.For(0, maximum_operations, options, (a, loopState) => 
     { 
      // do work 

      token.ThrowIfCancellationRequested(); 
     }); 
    } 
    catch (OperationCanceledException) 
    { 
     // handle cancellation 
    } 
} 

Tất cả những phương pháp này là cách hợp lệ để chấm dứt thực hiện Parallel.For. Mà một trong những bạn sử dụng phụ thuộc vào yêu cầu của bạn.

Ví dụ:

  • Có cần thiết để ngay dừng tất cả thực hiện khi dịch vụ cửa sổ của bạn dừng lại? Sau đó, bạn có thể sử dụng token.ThrowIfCancellationRequested()
  • Vòng lặp của bạn có đối phó với các đối tượng IDisposable cần dọn dẹp không? Sau đó, bạn có thể sử dụng loopState.Break() hoặc loopState.Stop()

Một số bài báo để tham khảo:

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