使用异步线程?

是的王|

好的,下面是我正在处理的服务器相关程序的代码。目前还很裸露,但是我打算尽快开始开发,只要我能很好地处理这些线程问题。

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

如果我要经过的唯一循环是StartListening中的循环,并且在此类的构造函数中,我将创建一个Thread的实例(据我了解,这与使用TaskCreationOptions.LongRunning创建任务相同,我知道任务更好,但实际上我不需要任务的任何功能,我只需要一个线程池之外的线程),而我的主线程/ ui线程调用此构造函数(它构成一个线程),那么我是否有必要使我的StartListening异步进行?

据我了解,异步和等待允许主线程在此循环中等待其工作。但是由于这是在它自己的线程上运行的,所以我有一点要再异步了吗?

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);

而且似乎没有用。有什么线索吗?

DevEstacion

引用:

我有一点要再异步了吗

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

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:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

异步使用线程池?

来自分类Dev

异步等待似乎使用UI线程

来自分类Dev

使用RoboSpice进行异步线程化

来自分类Dev

使用Java线程进行异步调用

来自分类Dev

线程池,多个线程,异步等。我应该使用什么?

来自分类Dev

为什么异步AWS Java SDK使用线程池?

来自分类Dev

使用异步触发线程并超出其未来范围是否安全?

来自分类Dev

是Apache asyncClient实际异步还是在后台使用线程

来自分类Dev

使用线程池而不是异步IO的HttpClient.SendAsync?

来自分类Dev

使用C ++ 11的可变数量的异步线程

来自分类Dev

在多线程代码中使用F#事件和异步

来自分类Dev

如何使用Mockito测试正在运行异步线程的方法

来自分类Dev

在异步块中使用线程不安全值

来自分类Dev

异步计算总是必须使用单独的线程吗?

来自分类Dev

使用FileIO.ReadTextAsync写入线程安全异步文件

来自分类Dev

在服务器上使用线程与异步编程

来自分类Dev

异步任务和线程池执行器的使用

来自分类Dev

在 C# 中使用线程异步执行语句

来自分类Dev

后台线程与异步线程池

来自分类Dev

在中等大小的JSON文件上使用线程池进行异步读取比异步读取更快

来自分类Dev

线程的异步委托

来自分类Dev

异步和线程文化

来自分类Dev

异步等待线程内部

来自分类Dev

异步阻塞线程魔术

来自分类Dev

异步等待和线程

来自分类Dev

介绍后台异步线程

来自分类Dev

异步等待线程内部

来自分类Dev

异步任务或线程

来自分类Dev

Android:方法的异步线程