2013-06-04 66 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

相关问题