Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用tcp套接字异步发送/接收固定数量的数据_C#_Sockets_Tcp - Fatal编程技术网

C# 使用tcp套接字异步发送/接收固定数量的数据

C# 使用tcp套接字异步发送/接收固定数量的数据,c#,sockets,tcp,C#,Sockets,Tcp,在我的应用程序中,我通过TCP套接字进行异步通信 我不喜欢套接字类的发送和接收操作(同步或异步)在传输请求的字节数之前完成。例如:当我想从套接字读取X字节时,我不想关心需要多少读取操作才能有效地实现这一点(在我的应用程序逻辑中)。我只想在完成时(或发生错误时)收到通知 有像BeginSendFixed、EndSendFixed、BeginReceiveFixed和EndReceiveFixed这样的东西会很好。它们的行为与BeginSend、EndSend、BeginReceive、EndRec

在我的应用程序中,我通过TCP套接字进行异步通信

我不喜欢套接字类的发送和接收操作(同步或异步)在传输请求的字节数之前完成。例如:当我想从套接字读取X字节时,我不想关心需要多少读取操作才能有效地实现这一点(在我的应用程序逻辑中)。我只想在完成时(或发生错误时)收到通知

有像BeginSendFixed、EndSendFixed、BeginReceiveFixed和EndReceiveFixed这样的东西会很好。它们的行为与BeginSend、EndSend、BeginReceive、EndReceive完全相同,但在传输请求的字节数之前不调用回调

我正在考虑自己实施这项计划,基于:

在DoTaskHelper函数中,我将调用尽可能多的(同步)发送或接收,直到所有数据都被传输


这是一种方法,还是有一种不同(更好)的方法来隐藏我的应用程序逻辑对多个发送/接收的需求?

我建议使用
TaskCompletionSource
类来实现这一点。这样做的好处是不必在等待I/O时烧掉线程。首先将现有(异步)API包装为
Task
s,然后使用
TaskCompletionSource
创建API可能会更容易


请注意,
TaskCompletionSource
是在.NET4中添加的。如果您还不在该平台上,那么我建议将完成例程封送到UI线程(使用中基于事件的异步模式套接字包装器可以轻松完成),然后将它们通过特定于您的协议的解析器(例如.

我建议为此使用
TaskCompletionSource
类。这样做的好处是不必在等待I/O时烧掉线程。首先将现有(异步)API包装为
Task
s,然后使用
TaskCompletionSource
创建API可能会更容易


请注意,
TaskCompletionSource
是在.NET4中添加的。如果您还不在该平台上,那么我建议将完成例程封送到UI线程(使用中基于事件的异步模式套接字包装器可以很容易地完成),然后将它们放入特定于您的协议的解析器中(例如)。

谢谢您的回答!我被限制使用.NET2;我不确定是否要使用第三方库进行网络连接。但无论如何,我会仔细看看你的建议..NET 2???甚至Nito.Async也需要3.5客户端。。。我要向你们的当局指出,你们被迫使用5年多的技术,这在互联网时代是一个很长的时间。请考虑使用第三方库进行网络连接。这使它变得非常简单(有很多极端情况,而且很多MSDN示例套接字代码对于这些情况来说都是错误的)。除了我的之外,还有几个商业图书馆。谢谢你的回答!我被限制使用.NET2;我不确定是否要使用第三方库进行网络连接。但无论如何,我会仔细看看你的建议..NET 2???甚至Nito.Async也需要3.5客户端。。。我要向你们的当局指出,你们被迫使用5年多的技术,这在互联网时代是一个很长的时间。请考虑使用第三方库进行网络连接。这使它变得非常简单(有很多极端情况,而且很多MSDN示例套接字代码对于这些情况来说都是错误的)。除了我的图书馆外,还有几家商业图书馆。