使用异步线程?

时间:2014-12-18 06:04:08

标签: c# multithreading asynchronous

好的以下是我正在处理的服务器相关程序的代码。目前这个时候已经很光了,但我打算在我能完美地完成这个线程之后立即开始开发。

今天我对线程的问题涉及下面代码底部的有用性。

如果我唯一的循环是StartListening中的循环,并且在这个类的构造函数中我创建了一个Thread的实例(据我所知,与使用TaskCreationOptions.LongRunning创建任务相同,我知道任务更好但实际上我不需要任务的任何功能我只需要一个线程池外的线程)并且我的主线程/ ui线程调用这个构造函数(它创建一个线程)然后有一点让我异步我的StartListening?

据我所知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);

似乎没有用。有线索吗?

1 个答案:

答案 0 :(得分:0)

引用:

  

让我再次异步了

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

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:

  

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

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