我一般都对部分实现接口持谨慎态度.但是,IAsyncResult它有点特殊情况,因为它支持几种截然不同的使用模式.你经常使用/看看使用AsyncState/ AsyncCallbackpattern,而不是只是调用EndInvoke,使用AsyncWaitHandle或轮询IsCompleted(yuck)?
相关问题:检测ThreadPool WorkItem是否已完成/等待完成.
考虑这个类(非常近似,需要锁定):
public class Concurrent<T> {
private ManualResetEvent _resetEvent;
private T _result;
public Concurrent(Func<T> f) {
ThreadPool.QueueUserWorkItem(_ => {
_result = f();
IsCompleted = true;
if (_resetEvent != null)
_resetEvent.Set();
});
}
public WaitHandle WaitHandle {
get {
if (_resetEvent == null)
_resetEvent = new ManualResetEvent(IsCompleted);
return _resetEvent;
}
public bool IsCompleted {get; private set;}
...
Run Code Online (Sandbox Code Playgroud)
它WaitHandle(懒惰创建,正如IAsyncResult文档中所述)IsCompleted,但我没有看到AsyncState …
在c#中提供Method的同步和异步版本会询问如何提供方法的异步版本.
其中一个答案表明,类库开发人员应尽可能避免在单一责任原则的基础上提供异步方法.
IAsyncResult设计模式允许各种编程模型,但学习起来更复杂,并提供大多数应用程序不需要的灵活性.在可能的情况下,类库设计者应该使用事件驱动模型实现异步方法.在某些情况下,库设计者还应该实现基于IAsyncResult的模型.
??
"事件驱动模型"是指如果方法的同步版本是Verb(),则该方法的异步版本是Verb Async(),并且存在Verb Completed事件.
IAsyncResult模式是众所周知的Begin Verb()和End Verb()方法.