我的即时消息库利用Begin / End异步模式来处理通过等待确认的套接字发送的大多数(如果不是全部)通信。
因此,我发现自己在很多操作中都实现了IAsyncResult。 (ChangeNicknameOperation,SendMessageOperation,AddUserOperation等..)
我决定为我的异步操作创建一个名为AsyncOperationBase的基类,它包含IAsyncResult的标准实现,包括将操作设置为完整的方法。
这是一种常见做法吗?我觉得有点不必要,因为重复的代码相当小。
另外,在调用AsyncResult的回调时,是否建议在另一个线程上调用它,或者调用完成操作的线程是否完全合法?
由于
答案 0 :(得分:2)
对于您的问题,C#5中的新async/await kewords将是最佳解决方案。但是在它发布之前,可以使用基类。为了支持我的主张,我已经使用Reflector查看了在BCL中实现IAsyncResult的类,并且有一个名为System.Net.LazyAsyncResult的大型基类,其中有20个类派生自。所以是的,这是一个很好的做法,只有在我们拥有C#5之后才会变得更容易。
以下是从LazyAsyncResult派生的类列表:
internal class System.Net.ContextAwareResult
internal class System.Net.ListenerClientCertAsyncResult
internal class System.Net.ListenerAsyncResult
internal class System.Net.HttpRequestStream/HttpRequestStreamAsyncResult
internal class System.Net.HttpResponseStreamAsyncResult
internal class System.Net.NestedMultipleAsyncResult
internal class System.Net.NestedSingleAsyncResult
internal class System.Net.WorkerAsyncResult
internal class System.Net.Cache.CombinedReadStream/InnerAsyncResult
internal class System.Net.Cache.ForwardingReadStream/InnerAsyncResult
internal class System.Net.BufferAsyncResult
internal class System.Net.Base64Stream/ReadAsyncResult
internal class System.Net.Base64Stream/WriteAsyncResult
internal class System.Net.BufferedReadStream/ReadAsyncResult
internal class System.Net.Mime.MimeBasePart/MimePartAsyncResult
internal class System.Net.Mime.MultiAsyncResult
internal class System.Net.Mime.QuotedPrintableStream/WriteAsyncResult
internal class System.Net.Mail.SmtpConnection/ConnectAndHandshakeAsyncResult
internal class System.Net.Mail.SmtpReplyReaderFactory/ReadLinesAsyncResult
internal class System.Net.Mail.SendMailAsyncResult
此致, Alois Kraus