2013-08-26 20 views
8

Khi nào tôi phải vứt bỏ một CancellationTokenSource? Nếu tôi ví dụ như làm một và đặt nó trong Chủ đề mọi i bấm vào một nút:CancellationTokenSource, Khi nào cần xử lý?

private void Button_Click(object sender, EventArgs e) 
    { 
     if (clicked == false) 
     { 

      clicked = true; 
      CTSSend = new CancellationTokenSource(); 
      Thread1 = new Thread(() => Method1(CTSSend.Token)); 
      Thread1.Start(); 
      Thread2 = new Thread(() => Method2(CTSSend.Token)); 
      Thread2.Start(); 
     } 
     else 
     { 
      CTSSend.Cancel(); 
      CTSSend.Dispose(); 
      clicked = false; 
     } 
    } 

Am i nghĩa vụ phải xử lý nó như thế? Vì vậy, nếu có, nó sẽ có một chút vấn đề khi tôi cần phải đặt nó vào Disposer sẽ bỏ đi khi ứng dụng đóng lại, vì không bảo đảm rằng nó sẽ không được xử lý nếu tôi không cẩn thận chờ nó và điều đó sẽ gây ra một ObjectDisposedException.

Tôi thậm chí đã thử với điều này để ngăn chặn các trường hợp ngoại lệ (như tôi muốn không sử dụng Try Catch, tôi muốn thậm chí không nhận được lỗi ở nơi đầu tiên trong trường hợp này).

 if (CTSSend != null) 
     { 
      CTSSend.Cancel(); 
      CTSSend.Dispose(); 
     } 
     if (CTSReceive != null) 
     { 
      CTSReceive.Cancel(); 
      CTSReceive.Dispose(); 
     } 

Nhưng tốt, có lẽ tôi chỉ nên vứt bỏ nó cuối cùng và không thải bỏ nó sau khi Huỷ mọi lần? Mặc dù tôi không thích cách tiếp tục thêm tài nguyên vào một đối tượng mới.

Mọi người làm gì với những trường hợp này?

CHỈNH SỬA:

Câu hỏi cụ thể hơn sẽ giải quyết được (trong trường hợp của tôi).

Làm cách nào tôi có thể ràng buộc bool với CancellationToken? Vì vậy, tôi có thể có một cái gì đó như CTS.IsDisposed;

Một số đối tượng có điều đó, nhưng CTS không, nếu có, nó sẽ giải quyết được vấn đề tôi đang gặp phải. Tôi hiện đang sử dụng một bool riêng biệt, đó không phải là một cái gì đó tôi thích.

+3

Đó là một "trùng lặp" có, nhưng người kia không thực sự nhận được câu trả lời, mọi người nói khác nhau. Một số người nói, bạn có thể để nó được, nói khác, bạn phải vứt bỏ nó. Và tôi tự hỏi, làm thế nào bạn có thể vứt bỏ nó mà không có cơ hội của một ngoại lệ khi bạn đóng nếu nó đã được xử lý. – Zerowalker

Trả lời

5

Họ đã thực hiện một số phân tích tại đây When to dispose CancellationTokenSource? và có vẻ như nó khá vô ích khi cố gắng xử lý chính xác nó. Hãy để GC thu thập nó (và nếu bạn nhìn vào gần như tất cả các ví dụ của MSDN nó không được xử lý)

+2

'Các phiên bản IDisposable' phải được xử lý, ngay cả khi nó không thuận tiện để làm như vậy. –

+0

@SamuelNeff Vì vậy, trong các ứng dụng Winforms tất cả các điều khiển được xử lý? :-) Từ khóa ở đây là "nên", không phải "phải". – xanatos

+0

@SamuelNeff Tôi sẽ thêm rằng tôi đã làm một số nghiên cứu ... Ví dụ, trên một cái gì đó kết nối như 'Task': http://stackoverflow.com/a/5986082/613130 ​​ – xanatos

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