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
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 đó.
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:
- Bắt đầu một
Task
mới. Điều này có lẽ là sạch hơn. - 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.
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
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
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).
- 1. Mẫu để tự hủy và khởi động lại tác vụ
- 2. Cách chạy tác vụ khi dịch vụ windows khởi động?
- 3. Tác vụ lặp lại của Android
- 4. Khởi động lại tác vụ hoặc tạo một tác vụ mới?
- 5. Làm thế nào để khởi động lại dịch vụ RabbitMQ
- 6. Làm thế nào để khởi động và dừng máy chủ jboss bằng cách sử dụng tác vụ Ant?
- 7. Cách khởi động lại dịch vụ?
- 8. Cách chính xác để khởi động lại tác vụ theo lịch ScheduledExecutorService là gì?
- 9. Làm cách nào để xóa hoàn toàn tác vụ và chỉ để lại hoạt động mới?
- 10. Ngăn ứng dụng web khởi động lại trên chuyển đổi tác vụ iPad
- 11. Hợp tác đa tác vụ bằng cách sử dụng TPL
- 12. Đặt lại thanh tác vụ sau khi sử dụng SearchView
- 13. Làm cách nào để đặt lại trang Khởi động ASP.NET?
- 14. Tác vụ lặp lại hàng tuần emacs org-mode
- 15. Dịch vụ có thể khởi động lại bằng cách sử dụng Guava
- 16. Làm cách nào để khởi động lại máy chủ mysql?
- 17. Làm cách nào để khởi động lại git bash?
- 18. Làm cách nào để khởi động lại chuỗi chết?
- 19. Tệp hàng loạt để khởi động lại dịch vụ. Windows
- 20. Khởi động các tác vụ nền với Capistrano
- 21. Cách khởi động lại dịch vụ từ xa?
- 22. Tác vụ Ant để tự động khởi động máy chủ và ứng dụng của tôi
- 23. Làm cách nào để sử dụng ng-click để tự động tải lại dữ liệu ng-lặp lại?
- 24. Làm cách nào để thay đổi động tác của Thanh tác vụ?
- 25. Làm cách nào để cập nhật ứng dụng web Tomcat mà không cần khởi động lại toàn bộ dịch vụ?
- 26. Làm cách nào để sử dụng lại một truy vấn lớn mà không lặp lại nó?
- 27. Tôi làm cách nào để chia sẻ một dịch vụ giữa các hoạt động mà không cần khởi động lại?
- 28. Làm thế nào để làm khởi động lại với Unicorn?
- 29. Cách sử dụng tác vụ XmlPeek?
- 30. Android-ẩn thanh tác vụ trong khi khởi động và sau đó hiển thị lại nó?
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
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. –
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