使用异步线程

本文关键字:线程 异步 | 更新日期: 2023-09-27 18:34:30

好的,下面是我正在处理的服务器相关程序的代码。目前它非常裸露,但我打算尽快开始开发,只要我能完美地处理这些线程的东西。

今天,我关于线程的问题与以下代码底部部分的有用性有关。

如果我唯一的循环是 StartListen 中的循环,并且在此类的构造函数中,我创建了一个线程的实例(据我所知,这与使用 TaskCreationOptions.LongRun 创建任务相同,我知道任务更好,但实际上我不需要任务的任何功能,我只需要线程池之外的线程(,我的主线程/UI 线程调用这个构造函数(它制作了一个线程(,然后我有没有点异步我的开始收听?

据我了解,async 和 await 允许主线程在我们在此循环中等待时执行其操作。但是由于这是在它自己的线程上运行的,我有什么意义可以再异步它了吗?

ConnectionThread = new Thread(StartListening);
ConnectionThread.Name = "Connection Handle";
ConnectionThread.Start();

--------------------------上面是顶部细分市场-------------------------

public async void StartListening()
{
    listener = new TcpListener(15111);
    listener.Start();
    try
    {
        while (running)
        {
            TcpClient tcpclient = await listener.AcceptTcpClientAsync();
            Client client = new Client(tcpclient, ((IPEndPoint)tcpclient.Client.RemoteEndPoint).Address.ToString());
            Task handshakeTask = Task.Factory.StartNew(() => {
                ClientHandle.AddToClientPool(client);
                SendRequestInformation(client, 1);
            });
        }
    }
    catch (Exception e)
    {
        if (MainWindow.debugWindow != null)
            MainWindow.mainWindowDispacter.BeginInvoke(SendDebugMessage, new Object[] { e.ToString() });
        else
            Console.WriteLine(e.ToString());
    }
}

由于我已经在这里,我目前正在使用,

Byte[] buffer = new byte[4068];
var AmountRead =  await stream.ReadAsync(buffer, 0, buffer.Length, cts);

从客户端获取消息。似乎我得到了太多数据,因为字节太大了。所以我试了。

var AmountRead =  await stream.ReadAsync(buffer, 0, t.getClientSocket().ReceiveBufferSize, cts);

而且似乎不起作用。有什么线索吗?

使用异步线程

引用:

我有没有意义再异步它了

要回答您的问题,是的,这确实是有道理的,特别是如果您希望该线程上的进程在线程上是非阻塞的。在您的代码中指出这一点。

while (running)
{
    TcpClient tcpclient = await listener.AcceptTcpClientAsync(); // NOTE 1 Below
    Client client = new Client(tcpclient, 
        ((IPEndPoint)tcpclient.Client.RemoteEndPoint).Address.ToString());
    Task handshakeTask = Task.Factory.StartNew(() => // NOTE 2 Below
    {
        ClientHandle.AddToClientPool(client);
        SendRequestInformation(client, 1);
    });
}

注1:

线程将暂停并等待调用的方法完成,并在完成后执行

注2:

它将从调用的异步方法异步执行。因此,您创建的 Thread 将在该代码块之后继续循环,因为它在另一个线程中执行。

因此,如果您希望线程执行得更快,并且不需要线程异步启动方法的响应,那么这是有意义的。