簡體   English   中英

C# .NET 3.5:如何調用事件處理程序並等待它完成

[英]C# .NET 3.5 : How to invoke an event handler and wait for it to complete

我有一個 class 包含一個工作線程,該線程從循環中的隊列接收數據。

應用程序的另一部分從該 class 接收一個事件,class 為每個隊列項引發該事件。

這些事件是異步觸發的,因此在繁忙時間應用程序的其他部分可以同時處理多個事件。

這應該沒問題,但我們發現了一個可能導致問題的場景。

在解決主要問題時,我們需要一個快速的解決方案。 該框架是否提供了一種簡單的方法,我可以強制工作線程在處理每個事件時等待(因此它們是按順序處理的)? 如果沒有,實現這一點的最簡單方法是什么?

一個簡單的答案是 lock() 在事件處理程序中的單個 object 上。 所有的tads都將等待獲得鎖。

ManualResetEvent class在這里可能對您有所幫助,除非我不理解您的問題。 您可以使用它來阻止下一個事件的觸發,直到最后一個事件完成。

我的猜測是,您只想通過引發事件並直接調用該方法來使 go 遠離觸發動作。

AFAIK 事件將是異步的,我不知道有任何“簡單”的方法來改變它。

原來還有另一個答案。 您可以將以下屬性添加到方法中。

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]

沒有通用的方法。

最后,處理程序需要提供一種跟蹤機制。

如果您使用 BeginInvoke,而不是直接引發事件,則可以使用包裝器,在其中同步調用真實事件處理程序,然后異步引發包裝器。 包裝器可以維護一個計數器(具有互鎖操作)或根據您的需要設置一個事件。

就像是:

TheDelegate realHandler = theEvent;
var outer = this;
ThreadPool.QuereUserWorkItem(x => {
  // Set start of handler
  realHandler(outer, eventArgs);
  // Set handler finished
};

所有接收隊列讀取工作線程引發的事件的事件處理程序都在隊列讀取工作線程中調用。 只要事件處理程序不產生自己的線程,您就應該能夠通過在隊列讀取工作線程上調用 Thread.Join() 來等待事件處理程序完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM