2013-06-04 67 views
3

我使用RegisterWaitForSingleObject調用它的基本用法形式來調用提供的超時值的方法,並且一切正常。不過有一個特殊的scerio我正在使用這個調用RegisterWaitForSingleObject的代碼發生在事件處理程序中,我需要傳遞迴調方法一些額外的信息。目前回調方法有以下所需的簽名:如何使用RegisterWaitForSingleObject將參數傳遞給回調方法?

public void MyCallBackMethod(object state, bool timedOut) 

所以我可以這樣做技術上:現在

public void MyCallBackMethod(object state, bool timedOut, string SomeValue) 

但是我不知道是哪個值手動發送的statetimeout時試圖在呼叫時添加此值RegisterWaitForSingleObject

ThreadPool.RegisterWaitForSingleObject(_stop, MyCallBackMethod(?,?, "ABC123"), null, 5000, true); 

如何正確地將其他值傳遞給使用RegisterWaitForSingleObject註冊的回撥方法?

+0

參見[?C#傳遞額外的參數給事件處理程序(http://stackoverflow.com/questions/4215845/c-sharp-passing-extra-parameters-to-an-event-handler),[C#:傳遞參數給回調函數](http://stackoverflow.com/questions/3184947/c-passing-parameters-to-callbacks )和其他許多人。 –

+0

@RaymondChen - 其實我至少在實施的解決方案中並不完全相同。基本上我無法從這些帖子推斷出我的問題的答案。 ChrisSinclair的回答似乎一度被揭露出來。也許這只是我缺乏理解,所以感謝鏈接。 – atconway

+1

相同的形狀,只是名稱是不同的。您可以創建一個接受事件參數的lambda表達式,並使用任何其他參數將它們傳遞給回調函數。在第一種情況下,'id => AfterSaveMethod2(id,index)'基本上與'(state,timeout)=> MyCallbackMethod(state,timeout,「ABC123」)'相同,只是'id'改爲'state ,超時和索引更改爲「ABC123」。同樣的,如果你把'(sender)=> evHandler(sender,someData)'並將'sender'改爲'state,timeout'和'someData'爲''ABC123'',那麼你就有了答案。這是一樣的模式。 –

回答

3

你可以利用lambda的/ closure來忽略其他參數,只需調用方法你想要的值與你想要的值?

ThreadPool.RegisterWaitForSingleObject(
    _stop, 
    (state, timeout) => MyCallBackMethod("ABC123"), 
    null, 
    5000, 
    true); 

或者,如果你不MyCallBackMethod採取statetimeout事件參數:

ThreadPool.RegisterWaitForSingleObject(
    _stop, 
    (state, timeout) => MyCallBackMethod(state, timeout, "ABC123"), 
    null, 
    5000, 
    true); 
+0

我喜歡第一個解決方案,但是當我嘗試它時,我收到一條消息,指出'Can not resolve method MyCallBackMethod ...',指示沒有隻有單個參數的重載。第二個建議至少在構建時起作用。第一個解決方案的響應消息是否意味着我做錯了? – atconway

+0

Chris提供了兩個版本,具體取決於您是否希望'MyCallbackMethod'具有1或3個參數。選擇一個適合你的人。 –

+0

@RaymondChen - 使用'RegisterWaitForSingleObject'我*相信'需要'狀態'和'超時'參數,所以我不相信第一個選項將工作,如果這是顯示多種方式的目的。 – atconway

相關問題