【发布时间】:2015-11-12 01:25:04
【问题描述】:
我正在使用 TcpClient.Stream.ReadAsync 循环接收数据。传统上,当套接字正常关闭时,Windows 套接字返回 0。使用以下代码,ReadAsync 返回的唯一时间是有实际数据时。如果我关闭远程应用程序(优雅或强制),或者即使我在 TcpClient 上调用 Stream.Close(),ReadAsync 仍然没有完成或抛出异常。如何让 ReadAsync 完成?
var amountRead = await stream.ReadAsync(conn.buffer, 0, Connection.BufferSize, ct);
if (amountRead == 0)
break; //end of stream.
else
{
//Process Received Data here
}
【问题讨论】:
-
参见以下网页上的示例。这些示例适用于套接字,但可以将套接字替换为继承套接字的类,例如 TcpClient 或 TCPListener。 msdn.microsoft.com/en-us/library/w89fhyex(v=vs.110).aspx
-
这实际上是不同的 Socket API,即 BeginSend 和 BeginReceive。我的问题是关于较新的 await/async api:ReadAsync。
-
返回什么?
-
顺便说一下,
Stream.ReadAsync只是Stream.BeginRead和Stream.EndRead的包装。 -
根本不返回,没有错误码,没有异常。它返回的唯一时间是它实际接收到数据的时候。
标签: c# .net sockets async-await