gpt4 book ai didi

c# - IAsyncResult 引用

转载 作者:行者123 更新时间:2023-11-30 14:44:16 24 4
gpt4 key购买 nike

为什么 IAsyncResult 要求我保留对 BeginInvoked 的委托(delegate)的引用?

我希望能够写出这样的东西:

new GenericDelegate(DoSomething).BeginInvoke(DoSomethingComplete);

void DoSomethingComplete(IAsyncResult ar)
{
ar.EndInvoke();
}

最佳答案

在执行普通1 委托(delegate)BeginInvoke 时,您不需要保留自己对委托(delegate)的引用;您可以将 IAsyncResult 转换为 AsyncResult 并从 AsyncDelegate 属性中检索委托(delegate)。在有人说“这是一个肮脏的黑客”之前,it's documented as being valid at MSDN .

The AsyncResult class is used in conjunction with asynchronous method calls made using delegates. The IAsyncResult returned from the delegate's BeginInvoke method can be cast to an AsyncResult. The AsyncResult has the AsyncDelegate property that holds the delegate object on which the asynchronous call was invoked.

所以你可以这样写:

new GenericDelegate(DoSomething).BeginInvoke(DoSomethingComplete);

void DoSomethingComplete(IAsyncResult ar)
{
((GenericDelegate)((AsyncResult)ar).AsyncDelegate)).EndInvoke();
}

请注意,您仍然需要知道原始委托(delegate)的类型(或者至少,我还没有找到解决此限制的方法;然后我又没有尝试过)。


1 这里的“正常”是指委托(delegate)实例上的 BeginInvoke,使用编译器生成的方法。当使用预定义的方法时,即当使用声明其自己的 BeginX/EndX 方法的类时,不能保证这种转换为 AsyncResult 的技术有效。这是因为类可能在内部做一些更聪明的事情,例如阻塞 IO 完成端口,因此可能使用不同类型的 IAsyncResult。然而,在假设的场景中,它会工作得很好。

关于c# - IAsyncResult 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/688581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com