2011-04-25 64 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