试图找出我是否应该使用异步方法或没有如:是否有必要使用异步开始/结束方法(如果已经在单独的线程上)?
和
,而不是他们的同步TcpListener.AcceptTcpClient
和NetworkStream.Read
版本。我一直在看相关的线程,但我仍然有点不确定一件事:
问题:使用异步方法的主要优点是GUI没有被锁定。但是,这些方法将在单独的Task线程上调用,因此它不存在任何威胁。此外,TcpListener.AcceptTcpClient
会阻塞该线程直到建立连接,因此不会浪费CPU周期。既然是这样,那么为什么那么多人总是推荐使用异步版本呢?在这种情况下,似乎同步版本会更好?
另外,使用异步方法的另一个缺点是增加了对象的复杂性和不断转换。例如,有这样做:
private void SomeMethod()
{
// ...
listener.BeginAcceptTcpClient(OnAcceptConnection, listener);
}
private void OnAcceptConnection(IAsyncResult asyn)
{
TcpListener listener = (TcpListener)asyn.AsyncState;
TcpClient client = listener.EndAcceptTcpClient(asyn);
}
与此相反:
TcpClient client = listener.AcceptTcpClient();
而且好像异步版本将有更多的开销,因为不必创建另一个线程。 (基本上,每个连接都会有一个线程,然后在读取该线程时也会有另一个线程。)。
此外,还有TcpListener的装箱和拆箱以及与创建,管理和关闭相关的开销这些额外的线程。
基本上,通常只有单个线程用于处理单独的客户端连接,现在有了,然后为每种类型的操作执行了额外的线程(读取/写入流数据并侦听服务器端的新连接)
如果我错了,请纠正我。我对线程仍然很陌生,我试图理解这一切。然而,在这种情况下,它似乎使用普通的同步方法,只是阻塞线程将是最佳的解决方案?