有关IAsyncResult实现的问题

时间:2011-04-25 04:13:23

标签: c# .net asynchronous

我的即时消息库利用Begin / End异步模式来处理通过等待确认的套接字发送的大多数(如果不是全部)通信。

因此,我发现自己在很多操作中都实现了IAsyncResult。 (ChangeNicknameOperation,SendMessageOperation,AddUserOperation等..)

我决定为我的异步操作创建一个名为AsyncOperationBase的基类,它包含IAsyncResult的标准实现,包括将操作设置为完整的方法。

这是一种常见做法吗?我觉得有点不必要,因为重复的代码相当小。

另外,在调用AsyncResult的回调时,是否建议在另一个线程上调用它,或者调用完成操作的线程是否完全合法?

由于

1 个答案:

答案 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