2011-04-25 63 views
1

我的即时消息库利用开始/结束异步模式来处理等待确认的套接字发送的大多数(如果不是全部的话)通信。关于IAsyncResult实现的问题

因此,我发现自己为相当多的操作实现了IAsyncResult。 (ChangeNicknameOperation,SendMessageOperation,AddUserOperation等)。

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

这是常见的做法吗?考虑到重复的代码非常少,我觉得这样做有点不必要。

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

感谢

回答

2

有关问题的新async/await kewords在C#5将是最好的解决方案。但是直到它发布之后,才能和基类一起使用。为了备份我的声明,我已经在Reflector中查看了在BCL中实现IAsyncResult的类,并且有一个名为System.Net.LazyAsyncResult的大型基类Clas,其中有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 

你的, 阿洛伊斯·克劳斯

+0

注虽然从异步IO进来时,你*可能*想避免使用'Task []',因为a:通过任务调度器(这是不必要的)绑定你一些工作,b:它引入了一个很多终结者;我有一个类似的API,并且一旦微软澄清了我发现的一些错误(在异步CTP) – 2011-04-25 06:58:25

+0

非常有趣的Marc。当我拥有一个与您的网站一样大的网站时,我会更深入地了解BookSleeve ;-) – 2011-04-25 10:12:05