好的,下面是我正在处理的服务器相关程序的代码。目前还很裸露,但是我打算尽快开始开发,只要我能很好地处理这些线程问题。
今天,我有关线程的问题与以下代码底部的有用性有关。
如果我要经过的唯一循环是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);
而且似乎没有用。有什么线索吗?
引用:
我有一点要再异步了吗
要回答您的问题,是的,这确实有意义,特别是如果您希望该线程上的进程在该线程上是非阻塞的。在您的代码中指出这一点。
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] 删除。
我来说两句