2010-03-08 36 views
6

Tôi đang lên kế hoạch sử dụng Trình xử lý sự kiện tự động đặt lại cho giao tiếp giữa các chủ đề.Đồng bộ hóa chủ đề .NET

EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.AutoReset); 

My sản xuất đang đề nhìn như dưới đây

produceSomething(); 
handle.Set(); 

Trong thread của người tiêu dùng, tôi phải tải dữ liệu cho mỗi một phút hoặc khi sản xuất được gọi là Set phương pháp

try 
{ 
    while(true) 
    { 
     handle.WaitOne(60000, false); 
     doSomething(); // Downloads data from Internet. 
         // Takes lot of time to complete it. 
    } 
} 
catch(ThreadAbortException) 
{ 
    cleanup(); 
} 

Câu hỏi của tôi là nếu chuỗi tiêu thụ đang chạy doSomething chức năng và các cuộc gọi của nhà sản xuất được đặt, thì trạng thái của đối tượng sự kiện Tự động đặt lại là gì?

Yêu cầu của tôi là ngay khi nhà sản xuất gọi phương thức thiết lập, tôi phải tải xuống dữ liệu mới từ Internet. Nếu chức năng doSomething đang chạy, khi Nhà sản xuất gọi phương thức thiết lập, tôi phải ngắt nó và gọi lại.

Trả lời

2

Sự kiện tự động đặt lại giống như một cổng đóng sau khi chuỗi đầu tiên đi qua. Nếu bạn đặt nó trong khi một hoặc nhiều luồng đang chờ thì một luồng khởi động, khi đó sự kiện được đặt lại, phần còn lại của chuỗi tiếp tục chờ.

Nếu bạn đặt khi các chủ đề no đang chờ, thì chuỗi đầu tiên gọi handle.WaitOne sẽ không chờ, nhưng nó sẽ khiến sự kiện được đặt lại và sau đó tiếp tục.

từ http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

Calling Set tín hiệu AutoResetEvent để giải phóng một tiểu trình đang chờ. AutoResetEvent vẫn được báo hiệu cho đến khi một luồng chờ duy nhất được giải phóng, và sau đó tự động trở về trạng thái không được báo hiệu. Nếu không có chủ đề nào đang chờ, trạng thái vẫn được báo hiệu vô thời hạn.

Nếu một chuỗi gọi WaitOne trong khi AutoResetEvent ở trạng thái được báo hiệu, luồng không chặn. AutoResetEvent giải phóng luồng ngay lập tức và trở về trạng thái không được báo hiệu.

1

Sự cố với sự kiện đặt lại tự động trong trường hợp của bạn là "cài đặt" không hỗ trợ xếp hàng.

Tức là, đặt sự kiện tự động đặt lại cho phép một chuỗi để nhập, nếu bạn đặt lại một chuỗi trước khi bất kỳ chuỗi nào "tiêu thụ" sự kiện của bạn thì "bộ" đó sẽ bị mất. Bạn có thể mong đợi cho hai chủ đề để có thể nhập và tiêu thụ bất cứ điều gì bạn đã sản xuất nhưng trên thực tế chỉ ONE thread sẽ có thể làm điều đó.

Trong trường hợp của bạn, nếu bạn đang sản xuất với tốc độ nhanh hơn mức tiêu thụ thì sự kiện đặt lại tự động có thể gây nhầm lẫn. Hãy tưởng tượng trường hợp này.

  • Nhà sản xuất sản xuất một mặt hàng.
  • Người tiêu dùng tiêu thụ vật phẩm (đặt lại sự kiện và bắt đầu tải xuống từ bản in)
  • Nhà sản xuất sản xuất mục thứ hai.
  • Nhà sản xuất sản xuất mục thứ ba.
  • Sản phẩm dừng lại.
  • Người tiêu dùng tiêu thụ mặt hàng thứ hai (lưu lại sự kiện và bắt đầu tải xuống lại)
  • Người tiêu dùng KHÔNG cosume mục thứ ba từ khi sự kiện tự động được đặt lại.
Các vấn đề liên quan