tcplistener/tcpclient等待在运行后停止代码

问题描述 投票:0回答:1

此代码输出“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");
    }
}

尝试使其同步并将它们放入线程中,但这不起作用

c# asynchronous tcp tcpclient tcplistener
1个回答
0
投票

您需要将读取交给另一个任务或线程,否则客户端会被阻塞等待侦听器,而侦听器又会被阻塞等待回显给客户端,而客户端在尝试发送时仍会被阻塞。

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 的博客了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.