C# NetworkStream.ReadAsync的ReadTimeout
任务什么时候完成?一旦接收到指定长度的数据 如果是,它是否返回0?然后可以将用作属性,该属性仅可用于同步操作,对吗?ReadAsync()将自行“超时”。如果要取消,请使用CancellationToken。如果基础套接字关闭,ReadAsync()将立即返回0 ReadAsync一有数据就会返回,可能是1字节。它不会等到缓冲区已满C# NetworkStream.ReadAsync的ReadTimeout,c#,sockets,async-await,timeout,networkstream,C#,Sockets,Async Await,Timeout,Networkstream,任务什么时候完成?一旦接收到指定长度的数据 如果是,它是否返回0?然后可以将用作属性,该属性仅可用于同步操作,对吗?ReadAsync()将自行“超时”。如果要取消,请使用CancellationToken。如果基础套接字关闭,ReadAsync()将立即返回0 ReadAsync一有数据就会返回,可能是1字节。它不会等到缓冲区已满 static async Task StartTcpClientAsync(TcpClient tcpClient) { Conso
static async Task StartTcpClientAsync(TcpClient tcpClient)
{
Console.WriteLine($"Connection from: [{tcpClient.Client.RemoteEndPoint}]");
var stream = tcpClient.GetStream();
var buffer = new byte[1024];
while (true)
{
int x = await stream.ReadAsync(buffer, 0, 1024);
Console.WriteLine($"[{tcpClient.Client.RemoteEndPoint}] _ " +
$"read {x} bytes {System.Text.Encoding.UTF8.GetString(buffer)}");
}
}
static async Task StartTcpServerAsync()
{
var tcpListener = new TcpListener(new IPEndPoint(IPAddress.Any, 9999));
tcpListener.Start();
while (true)
{
var tcpClient = await tcpListener.AcceptTcpClientAsync();
_ = StartTcpClientAsync(tcpClient);
}
}
static async Task Main(string[] args)
{
_ = StartTcpServerAsync();
await Task.Delay(2000);
await RunSenderAsync();
}
static async Task RunSenderAsync()
{
var tcpClient = new TcpClient("127.0.0.1", 9999);
var s = tcpClient.GetStream();
tcpClient.NoDelay = true;
for (var i = 65; i < 91; i++)
{
s.Write(BitConverter.GetBytes(i), 0, 1);
await Task.Delay(1000);
}
}
我假设
ReadAsync
在达到时间限制时会像Read
一样失败,并出现IOException
。我认为ReadTimeout
的文档不完整。但是我可能错了,很遗憾,我现在无法证实我的说法。你可以对Read()或ReadAsync()进行研究,但它们都不会自己超时。如果底层套接字被拆除,由对等设备或其他中间设备(如有状态防火墙)重置,您将得到IOException。
[127.0.0.1:65201] read 1 bytes A
[127.0.0.1:65201] read 1 bytes B
[127.0.0.1:65201] read 1 bytes C
[127.0.0.1:65201] read 1 bytes D
[127.0.0.1:65201] read 1 bytes E
[127.0.0.1:65201] read 1 bytes F
...