Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用RegisterWaitForSingleObject将参数传递给回调方法?_C#_.net_Periodic Processing - Fatal编程技术网

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
的签名,我只是做了一个有根据的猜测。