C# 如何使用RegisterWaitForSingleObject将参数传递给回调方法?
我在它的基本用法表单中使用了一个C# 如何使用RegisterWaitForSingleObject将参数传递给回调方法?,c#,.net,periodic-processing,C#,.net,Periodic Processing,我在它的基本用法表单中使用了一个RegisterWaitForSingleObject调用,根据提供的超时值调用一个方法,一切正常。然而,我使用的是一个特殊的scerio,调用RegisterWaitForSingleObject的代码发生在事件处理程序中,我需要向回调方法传递一些额外的信息。当前回调方法具有以下必需的签名: public void MyCallBackMethod(object state, bool timedOut) 所以我可以从技术上做到这一点: public void
RegisterWaitForSingleObject
调用,根据提供的超时值调用一个方法,一切正常。然而,我使用的是一个特殊的scerio,调用RegisterWaitForSingleObject
的代码发生在事件处理程序中,我需要向回调方法传递一些额外的信息。当前回调方法具有以下必需的签名:
public void MyCallBackMethod(object state, bool timedOut)
所以我可以从技术上做到这一点:
public void MyCallBackMethod(object state, bool timedOut, string SomeValue)
但是现在我不知道在调用RegisterWaitForSingleObject
ThreadPool.RegisterWaitForSingleObject(_stop, MyCallBackMethod(?,?, "ABC123"), null, 5000, true);
如何正确地将其他值传递给使用
RegisterWaitForSingleObject
注册的回调方法?能否利用lambda的/closure忽略其他参数,并仅使用所需的值以所需方式调用该方法
ThreadPool.RegisterWaitForSingleObject(
_stop,
(state, timeout) => MyCallBackMethod("ABC123"),
null,
5000,
true);
或者如果您的MyCallBackMethod
采用了状态
和超时
事件参数:
ThreadPool.RegisterWaitForSingleObject(
_stop,
(state, timeout) => MyCallBackMethod(state, timeout, "ABC123"),
null,
5000,
true);
你看,还有很多其他的。@RaymondChen-事实上我是这样做的,至少在实现的解决方案中是不一样的。基本上,我无法从这些帖子中推断出我问题的答案。克瑞辛克莱尔的答案似乎是一针见血的。也许是因为我不理解,所以谢谢你的链接。形状相同,只是名字不同。创建一个lambda,该lambda接受事件参数并将它们与任何其他参数一起传递给回调。在第一种情况下,
id=>AfterSaveMethod2(id,index)
与(state,timeout)=>MyCallbackMethod(state,timeout,“ABC123”)
基本相同,只是id
更改为state,timeout
和index
更改为“ABC123”
。类似地,如果您使用(sender)=>evHandler(sender,someData)
并将sender
更改为状态,将超时设置为,将someData
更改为“ABC123”
,那么您就有了答案。这是相同的图案。@RaymondChen-谢谢你把这些点连接起来。因为这个用法对我来说是新的,所以我需要将它应用到我的特定示例中,以便更好地理解。我喜欢第一个解决方案,但是当我尝试它时,我收到一条消息,指示无法解析方法MyCallBackMethod…
指示没有只接受单个参数的重载。第二个建议至少在构建时有效。第一个解决方案的响应消息是否意味着我做错了?Chris提供了两个版本,具体取决于您是否希望MyCallbackMethod
具有1个或3个参数。选择一个适合您的。@RaymondChen-使用RegisterWaitForSingleObject
I*相信`需要state
和timeout
参数,因此如果这是显示多个方式的目的,我认为第一个选项不起作用。@atconway我想您现在已经解决了。我在这里提供的lambda方法(它们都)确实管理state
和timeout
的输入。在调用MyCallBackMethod
方法时,只有第一种方法会丢弃这两个参数。第二种方法将这些参数传递给您的方法。由于您从未指定您的MyCallBackMethod
的签名,我只是做了一个有根据的猜测。