Tôi có một chuỗi chạy mà ủy nhiệm ra một số nhiệm vụ. Khi một tác vụ hoàn tất, một sự kiện được nêu ra rằng nó đã hoàn thành. Các tác vụ này cần phải được chạy theo một thứ tự cụ thể và cần phải đợi công việc trước đó kết thúc. Làm thế nào tôi có thể làm cho các chủ đề chờ đợi cho đến khi nó nhận được sự kiện "hoàn thành nhiệm vụ"? (Ngoài trình tổ chức sự kiện rõ ràng đặt cờ và sau đó vòng lặp trong khi bỏ phiếu cờ)Phương pháp nào có thể được sử dụng để tạo chuỗi chờ sự kiện và sau đó tiếp tục thực hiện?
15
A
Trả lời
27
Tôi thường sử dụng tay cầm AutoResetEvent
chờ đợi khi tôi cần phải chờ đợi cho một nhiệm vụ không đồng bộ để kết thúc:
public void PerformAsyncTasks()
{
SomeClass someObj = new SomeClass()
AutoResetEvent waitHandle = new AutoResetEvent(false);
// create and attach event handler for the "Completed" event
EventHandler eventHandler = delegate(object sender, EventArgs e)
{
waitHandle.Set(); // signal that the finished event was raised
}
someObj.TaskCompleted += eventHandler;
// call the async method
someObj.PerformFirstTaskAsync();
// Wait until the event handler is invoked
waitHandle.WaitOne();
// the completed event has been raised, go on with the next one
someObj.PerformSecondTaskAsync();
waitHandle.WaitOne();
// ...and so on
}
5
Một tùy chọn sẽ là sử dụng EventWaitHandle để hoàn thành tín hiệu.
1
Bạn có thể sử dụng một ManualResetEvent cho việc này.
Chủ đề cần xử lý trước chỉ cần đặt lạiEvent và đợi cho đến khi kết thúc để Đặt sự kiện.
Chuỗi cần đợi có thể giữ tay cầm với nó và gọi resetEvent.WaitOne(). Thao tác này sẽ chặn luồng đó cho đến khi chuỗi đầu tiên hoàn tất.
Điều này cho phép bạn xử lý việc chặn và sắp xếp các sự kiện theo cách rất rõ ràng.
0
Tôi đã có kết quả tốt bằng cách sử dụng phương thức gọi lại mà chuỗi công nhân gọi khi thực hiện xong. Nó đánh bại bỏ phiếu và làm cho nó dễ dàng để vượt qua các thông số trở lại người gọi.
Các vấn đề liên quan
- 1. thực hiện tạm dừng hoạt động không được tiếp tục sau khi tạo lại phương thức
- 2. Có thể sử dụng cùng một chữ ký phương thức async trong C# 5.0 và có thể quyết định sau này để thực hiện phương pháp như vậy
- 3. từng chờ đợi cho đến khi kết thúc $ .ajax, và sau đó tiếp tục
- 4. Phương pháp Initialize được sử dụng cho và tôi có thực sự cần một phương pháp nào không?
- 5. Làm thế nào tôi có thể phát hiện khi Xác thực jQuery được thực hiện và gọi một cái gì đó dựa trên sự kiện đó?
- 6. Phương pháp trích xuất với tiếp tục
- 7. Làm thế nào để chờ đợi không đồng bộ trong x giây và thực hiện điều gì đó sau đó?
- 8. Tôi có thể chỉ định biến nào tôi muốn tồn tại sau khi hoàn thành việc chờ tiếp tục không?
- 9. Sự khác biệt giữa Mẫu quan sát và Phương pháp tiếp cận theo hướng sự kiện
- 10. Ưu điểm và nhược điểm của phương pháp có thể thực hiện được?
- 11. Làm thế nào để tiếp tục luồng phương pháp sử dụng khía cạnh OnException (PostSharp)?
- 12. Sử dụng nhóm phương pháp C# thực hiện mã
- 13. Chặn và đang chờ sự kiện
- 14. C#: Sự kiện ảo là gì và chúng có thể được sử dụng như thế nào?
- 15. Tôi có thể thực hiện ngắt dòng (tiếp tục dòng) bằng Python bằng cách nào?
- 16. nodejs: chờ đợi cho các phương pháp khác để kết thúc trước khi thực hiện
- 17. Khung thực thể .Có phương pháp chaining
- 18. Ngoài sự tò mò - có cách tiếp cận thực hiện tốt hơn để thực hiện chuỗi này thay thế không?
- 19. Blackberry Đẩy Thực hiện và chờ đợi sự thừa nhận
- 20. Tiếp tục thực thi mã sau khi ngoại lệ được ném và bắt được
- 21. Tiếp tục làm việc trên chi nhánh Git sau khi thực hiện yêu cầu kéo
- 22. Làm thế nào để chờ một sự kiện trong C#, với thời gian chờ và hủy
- 23. Làm thế nào để chờ hoàn thành chuỗi trước khi tiếp tục?
- 24. Tại sao Sql Server tiếp tục thực hiện sau khi raiserror khi xact_abort được bật?
- 25. Đang chờ sự kiện được xử lý
- 26. Bắt sự kiện khi video flash được thực hiện bằng cách sử dụng javascript
- 27. làm thế nào tôi có thể thực hiện biến áp đơn nguyên này với sự tiếp tục?
- 28. Làm cách nào để có thể sử dụng lại các truy vấn Khung thực thể (sử dụng các phương pháp)?
- 29. Phương pháp C# được thực hiện sau khi lắp ráp được nạp
- 30. Làm thế nào để thực hiện một sự kiện sử dụng phản ứng Extensions
Dựa trên câu trả lời đầu tiên, tôi đang làm một cái gì đó rất giống với điều này. Sự khác nhau giữa AutoResetEvent và EventWaitHandle được khởi tạo với EventResetMode.AutoReset là gì? – MGSoto
@MGSoto: Tôi nghĩ sự khác biệt là tối thiểu (nếu có): 'AutoResetEvent' kế thừa từ' EventWaitHandle', và dường như sử dụng hàm tạo của lớp cơ sở của nó để truyền 'EventResetMode.AutoReset' cho nó. –
Đừng quên, AutoResetEvent, WaitHandles vv thực hiện IDisposable –