为什么IAsyncResult要求我保留对BeginInvoked的代表的引用?
我希望能够写出这样的东西:
new GenericDelegate(DoSomething).BeginInvoke(DoSomethingComplete);
void DoSomethingComplete(IAsyncResult ar)
{
ar.EndInvoke();
}发布于 2009-03-27 07:20:37
我发现整个开始/结束模式不必要地复杂-所以我使用had a look at wrapping it up (与F#使用的非常相似)。结果:不再需要保留委托(等)。
发布于 2009-03-27 04:48:26
IAsyncResult是一个非常...过度使用的接口。要在如此多的场景中成为可用的接口,它只能真正具有适用于所有使用它的场景的属性和字段。否则,API将很难提供完全不适合其特定需求的参数。
只有在少数情况下,才会为委托创建IAsyncResult。其他场景,如Control.BeginInvoke,不是以委托开始的,如果接口属性存在,也不能提供委托。
IAsyncResult在这里采用了极简主义的方法,只有它的所有用途都能提供的属性。
发布于 2009-03-27 07:18:13
尝试将委托作为异步状态参数传递,例如,
class Program {
static void Main(string[] args) {
Action d = delegate {
Console.WriteLine("From the delegate");
};
var e = new ManualResetEvent(false);
d.BeginInvoke(r => {
((Action)r.AsyncState).EndInvoke(r);
e.Set();
}, d);
e.WaitOne();
}
}https://stackoverflow.com/questions/688581
复制相似问题