使用异步线程
本文关键字:线程 异步 | 更新日期: 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 将在该代码块之后继续循环,因为它在另一个线程中执行。
因此,如果您希望线程执行得更快,并且不需要线程异步启动方法的响应,那么这是有意义的。