2009-08-07 15 views
15

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?

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 
} 
+1

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

+0

@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ó. –

+2

Đừng quên, AutoResetEvent, WaitHandles vv thực hiện IDisposable –

5

Một tùy chọn sẽ là sử dụng EventWaitHandle để hoàn thành tín hiệu.

+0

bạn có thể xây dựng không? giải thích điều này tốt hơn và tôi nhất định sẽ bỏ phiếu! – Firoso

+1

+1. @firoso, có nhiều chi tiết trong bài viết msdn. –

+0

Bao gồm các ví dụ bằng nhiều ngôn ngữ – bdonlan

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