2012-02-27 34 views
13

Tôi có một nhiệm vụ chạy dài mà tôi đã triển khai bằng Thư viện song song nhiệm vụ. Khi nhiệm vụ bắt đầu, tôi lấy các ảnh chụp nhanh của một số giá trị đầu vào và các bộ sưu tập sau đó thực hiện các thao tác khác nhau bằng cách sử dụng thông tin đó. Nếu bất kỳ giá trị hoặc bộ sưu tập nào thay đổi trong khi Tác vụ đang chạy, tôi muốn chạy lại Tác vụ ngay sau khi hoàn thành. Tôi có nên tạo một Tác vụ mới hoặc có cách nào để sử dụng lại Tác vụ hiện tại không? Cách tốt nhất để bắt đầu lặp lại thứ hai là gì?Làm cách nào để khởi động lại/tái sử dụng Tác vụ lặp lại?

Trả lời

11

Tạo tác vụ mới.

Khi http://msdn.microsoft.com/en-us/library/dd270682.aspx chỉ ra, cố gắng khởi động lại tác vụ đang chạy hoặc hoàn thành, không được hỗ trợ. Nó hiếm khi là một ý tưởng tốt để làm một cái gì đó bình thường ném một ngoại lệ, và tái sử dụng một nhiệm vụ là một trong những điều đó.

+0

Bạn sẽ báo hiệu sự cần thiết của nhiệm vụ thứ hai như thế nào? Các thay đổi có thể xảy ra trong khi tác vụ gốc đang chạy hoặc không cho đến khi nó hoàn thành. – SonOfPirate

+0

Dựa trên các tiêu chí đó, tôi nghĩ bạn sẽ làm tốt với một nhiệm vụ duy nhất, không kết thúc mà thăm dò tình trạng hiện tại, và nếu nhà nước thay đổi, làm điều của bạn. Yêu cầu cơ bản ở đây là điều này xảy ra không đồng bộ, để tránh chặn luồng chính. Bạn sẽ cần đặt cờ của một số loại để chỉ ra Tác vụ mà ứng dụng đang đóng và nó sẽ chấm dứt. –

+0

Nhiệm vụ duy nhất, không chấm dứt là những gì tôi đang nghĩ. Tôi có thể sử dụng một CancellationToken để xử lý khi các ứng dụng được đóng lại nhưng tôi không chắc chắn những gì cơ chế tôi nên sử dụng để cờ mà tôi cần các nhiệm vụ để thực hiện các thuật toán của tôi. Nếu tôi sử dụng AutoResetEvent, thì tôi sẽ không thể hủy vì chuỗi Tác vụ sẽ bị tạm ngưng chờ sự kiện. Mặt khác, tôi đọc rằng sử dụng SpinWait là rất nhiều CPU. – SonOfPirate

1

Bạn không thể bắt đầu lại hiện tại Task. Vì vậy, bạn có hai tùy chọn:

  1. Bắt đầu một Task mới. Điều này có lẽ là sạch hơn.
  2. Chạy vòng lặp trong số Task của bạn để kiểm tra xem có điều gì đó đã thay đổi kể từ lần cuối cùng không và nếu có, bắt đầu một lần lặp mới.
+0

Cùng câu hỏi như trên: Bạn sẽ báo hiệu sự cần thiết cho nhiệm vụ thứ hai như thế nào? – SonOfPirate

+0

Khó mà nói mà không biết làm thế nào để bạn xác định rằng nhiệm vụ thứ hai là cần thiết. Nếu bạn muốn khởi động lại ngay cả sau khi nó đã hoàn thành, bạn có thể sử dụng các sự kiện. – svick

0

Bạn cũng có thể lập lại chương trình logic để sử dụng hàm con trỏ (hoặc đại biểu trong VB.NET).

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