如何使用RegisterWaitForSingleObject传递参数给回调方法?

3

我正在使用RegisterWaitForSingleObject调用其基本用法形式,在提供的超时值上调用方法,一切正常。然而,我使用它的一个特定场景是,在事件处理程序中调用RegisterWaitForSingleObject的代码,并且我需要将一些额外的信息传递给回调方法。目前回调方法具有以下所需签名:

public void MyCallBackMethod(object state, bool timedOut)

所以从技术上讲,我可以这样做:
public void MyCallBackMethod(object state, bool timedOut, string SomeValue)

然而现在我不知道在调用RegisterWaitForSingleObject时手动发送哪些值来设置statetimeout
ThreadPool.RegisterWaitForSingleObject(_stop, MyCallBackMethod(?,?, "ABC123"), null, 5000, true);

如何正确传递附加值到使用RegisterWaitForSingleObject注册的回调方法中?

@RaymondChen - 实际上我确实尝试过,但至少在实现的解决方案上并不相同。基本上,我无法从那些帖子中推断出对我的问题的答案。ChrisSinclair的答案似乎是一针见血的,一旦被澄清就好了。也许这只是我理解不够,所以感谢您提供的链接。 - atconway
1
形状相同,只是名称不同。您可以创建一个 lambda,它接受事件参数并将它们传递给回调函数以及任何其他参数。在第一种情况下,id => AfterSaveMethod2(id, index) 基本上与 (state, timeout) => MyCallbackMethod(state, timeout, "ABC123") 相同,只是 id 更改为 state, timeoutindex 更改为 "ABC123"。同样,如果您将 (sender) => evHandler(sender,someData) 更改为 state, timeoutsomeData 更改为 "ABC123",那么您就得到了答案。这是相同的模式。 - Raymond Chen
@RaymondChen - 感谢您将这些点连接起来。由于这种用法对我来说是新的,我需要将其应用到我的具体示例中以更好地理解。 - atconway
1个回答

3

您能利用lambda表达式/闭包来忽略其他参数,并仅使用您想要的值调用方法吗?

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

如果你的 MyCallBackMethod 方法接受 statetimeout 事件参数:

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

我喜欢第一种解决方案,但是当我尝试时,我收到了一个消息,指示“无法解析方法MyCallBackMethod...”,表明没有重载只接受单个参数的方法。第二个建议至少在构建时有效。第一种解决方案的响应消息是否意味着我做错了? - atconway
Chris提供了两个版本,具体取决于您想让MyCallbackMethod有1个还是3个参数。选择适合您的那个版本即可。 - Raymond Chen
@RaymondChen - 使用RegisterWaitForSingleObject相信需要statetimeout参数,因此如果展示多种方法的目的是为了使用第一种选项,则我不认为它会起作用。 - atconway
@atconway 我猜你现在已经弄清楚了。我在这里提供的lambda方法(两种方法)确实管理了statetimeout的输入。只有第一种方法在调用MyCallBackMethod方法时会丢弃这两个参数。而第二种方法会将这些参数传递给你的方法。由于你没有指定MyCallBackMethod的签名,所以我只是根据我的猜测来处理。 - Chris Sinclair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接