在我的应用程序中,我通过TCP套接字进行一些异步通信。
我不喜欢在传输请求的字节数之前允许Socket类的发送和接收操作(sync或async)完成的事实。例如:当我想从套接字读取X字节时,我不想关心实现这一点有多少读取操作(在我的应用程序逻辑中)。我只想在完成时(或发生错误时)收到通知。
有一些像BeginSendFixed,EndSendFixed,BeginReceiveFixed和EndReceiveFixed这样的东西会很不错。这些行为与BeginSend,EndSend,BeginReceive,EndReceive完全相同,但在传输请求的字节数之前不会调用回调。
我正在考虑自己实现这一点,基于:
http://msdn.microsoft.com/en-us/magazine/cc163467.aspx
在DoTaskHelper函数中,我将调用尽可能多的(同步)发送或接收,直到所有数据都被传输。
这是要走的路还是有一种不同的(更好的)方法来隐藏我的应用逻辑需要多次发送/接收?
答案 0 :(得分:0)
我建议使用TaskCompletionSource
类。这样做的好处是不会在等待I / O时烧坏线程。首先将现有(异步)API包装为Task
可能更容易,然后使用TaskCompletionSource
创建API。
请注意,在.NET 4中添加了TaskCompletionSource
。如果您尚未使用该平台,那么我建议将完成例程封送到UI线程(可以使用基于事件的异步轻松完成) Nito.Async.Sockets)中的模式套接字包装器,然后将它们放在特定于您的协议的解析器中(其示例为on my blog)。