此代码输出“8096”是预期的 13 倍 (ceil(100,000/8096) = 13)
但是在两个函数中的 while 循环之后,除了程序完成之外,没有其他任何东西运行,它们后面的 2 个 console.writlelines 不会运行(在之前打印,只是在 while 循环之后不打印)
这是我的代码:
Tcp客户端功能:
public static async void Main()
{
using TcpClient client = new TcpClient("localhost",50000);
NetworkStream stream = client.GetStream();
byte[] data = RandomNumberGenerator.GetBytes(100000);
await stream.WriteAsync(data,0,data.Length);
byte[] bytes = new byte[8096];
int i;
while((i = await stream.ReadAsync(bytes, 0, bytes.Length))>0)
{
Console.WriteLine(i);
}
Console.WriteLine("this doesnt get printed");
return;
}
tcp监听函数:
public static async void Main()
{
try
{
TcpListener server = new TcpListener(IPAddress.Any,50000);
server.Start();
TcpClient client = await server.AcceptTcpClientAsync();
NetworkStream stream = client.GetStream();
byte[] bytes = new byte[8096];
byte[] return_bytes = new byte[8096];
int i;
while((i = await stream.ReadAsync(bytes, 0, bytes.Length))>0)
{
await stream.WriteAsync(return_bytes,0,return_bytes.Length);
}
Console.WriteLine("this doesn't get printed");
server.Stop();
}
catch(Exception ex)
{
Console.WriteLine("port already in use");
}
}
尝试使其同步并将它们放入线程中,但这不起作用
您需要将读取交给另一个任务或线程,否则客户端会被阻塞等待侦听器,而侦听器又会被阻塞等待回显给客户端,而客户端在尝试发送时仍会被阻塞。
public static async Task Main()
{
byte[] data = RandomNumberGenerator.GetBytes(100000);
using TcpClient client = new TcpClient();
await client.ConnectAsync("localhost", 50000); // connect asynchronously
using NetworkStream stream = client.GetStream(); // needs using
var task = Task.Run(async () => { // hand off reads
byte[] bytes = new byte[8096];
int i;
while((i = await stream.ReadAsync(bytes, 0, bytes.Length)) > 0)
{
Console.WriteLine(i);
}
});
await stream.WriteAsync(data, 0, data.Length);
await task; // wait for reads to finish
Console.WriteLine("this doesnt get printed");
}
另请参阅@StephenCleary 的博客了解更多信息。