在我的应用程序中,我通过 TCP 套接字进行一些异步通信。
我不喜欢允许 Socket 类的发送和接收操作(同步或异步)在请求的字节数被传输之前完成这一事实。例如:当我想从套接字读取 X 字节时,我不想关心实现此目的(在我的应用程序逻辑中)需要多少读取操作。我只想在完成时(或发生错误时)收到通知。
如果有像 BeginSendFixed、EndSendFixed、BeginReceiveFixed 和 EndReceiveFixed 这样的东西就好了。它们的行为与 BeginSend、EndSend、BeginReceive、EndReceive 完全相同,但在传输请求的字节数之前不会调用回调。
我正在考虑自己实现这个,基于:
http://msdn.microsoft.com/en-us/magazine/cc163467.aspx
在 DoTaskHelper 函数中,我会调用尽可能多的(同步)发送或接收,直到所有数据都传输完毕。
这是要走的路还是有不同的(更好的)方法来隐藏我的应用程序逻辑对多次发送/接收的需求?
最佳答案
我建议为此使用 TaskCompletionSource
类。这样做的好处是不会仅仅等待 I/O 就烧毁线程。首先将现有(异步)API 包装为 Task
,然后使用 TaskCompletionSource
创建您的 API 可能会更容易。
请注意,TaskCompletionSource
是在 .NET 4 中添加的。如果您还没有使用该平台,那么我建议将完成例程编码到 UI 线程(这可以使用 Event 轻松完成-based Asynchronous Pattern socket wrappers in Nito.Async.Sockets ),然后将它们放入特定于您的协议(protocol)的解析器(例如 on my blog )。
关于c# - 使用 tcp 套接字异步发送/接收固定数量的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4951190/