3
我有一個異步類StartProcessing()
方法,當它完成處理時引發一個int ResultReady()
事件。 StartProcessing()
只需要很少的時間。等待,直到一個代表被調用
我想同步調用這個類。我的僞代碼應該是這樣的:
呼叫StartProcessing()
等待/休眠狀態,直到結果準備
返回結果
什麼設計模式最適合這個?你能指點我一個代碼示例嗎?
我有一個異步類StartProcessing()
方法,當它完成處理時引發一個int ResultReady()
事件。 StartProcessing()
只需要很少的時間。等待,直到一個代表被調用
我想同步調用這個類。我的僞代碼應該是這樣的:
呼叫StartProcessing()
等待/休眠狀態,直到結果準備
返回結果
什麼設計模式最適合這個?你能指點我一個代碼示例嗎?
這樣做的一個簡單方法是使用事件處理程序和等待代碼都可以訪問的ManualResetEvent
。來自事件處理程序的Set
和來自等待線程的WaitOne
(或具有超時的重載)。請注意,這無法在STA線程上完成,因此您無法在WinForms線程(應該始終是STA)內執行此操作,但是您不應該在UI線程內等待。
事情是這樣的:
var async = new AsyncClass();
var manualEvent = new ManualResetEvent();
async.ResultReady += args => manualEvent.Set();
async.StartProcessing();
manualEvent.WaitOne();
當我這樣做似乎ResultReady永遠不會被調用。我懷疑代理被設置爲在被阻塞的同一個線程中啓動。然而,我的案例中的代表是從我無法控制的框架中調用的。因此我從來沒有通過WaitOne。你對如何解決它有什麼想法嗎? – dynamokaj 2015-10-02 07:35:12