Попытка выяснить, следует ли мне использовать асинхронные методы или нет, например:
и
в отличие от их синхронных версий TcpListener.AcceptTcpClient
и NetworkStream.Read
.Я смотрел на связанные темы, но все еще немного не уверен в одном:
Вопрос: Основное преимущество использования асинхронного метода заключается в том, что графический интерфейс не заблокирован,Однако эти методы будут вызываться в отдельных потоках Task , так как это не угрожает.Кроме того, TcpListener.AcceptTcpClient
блокирует поток до тех пор, пока не будет установлено соединение, чтобы не тратить впустую циклы ЦП.Так как это так, то почему многие всегда рекомендуют использовать асинхронные версии?Похоже, что в этом случае синхронные версии будут лучше?
Кроме того, еще один недостаток использования асинхронных методов - повышенная сложность и постоянное приведение объектов.Например, чтобы сделать это:
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();
Также кажется, что асинхронные версии будут иметь гораздо больше накладных расходов из-зачтобы создать другой поток.(По сути, каждое соединение будет иметь поток, а затем при чтении этого потока также будет иметь другой поток. Threadception!)
Кроме того, существует упаковка и распаковка TcpListener и накладные расходы, связанные с созданием, управлением,и закрытие этих дополнительных потоков.
В основном, где обычно бывают отдельные потоки для обработки отдельных клиентских подключений, теперь есть такой, а затем дополнительный поток для каждого типа выполняемой операции (чтение / запись потоковых данных ипрослушивание новых подключений на стороне сервера)
Пожалуйста, исправьте меня, если я ошибаюсь.Я все еще новичок в потоках, и я пытаюсь понять все это.Тем не менее, в этом случае кажется, что использование обычных синхронных методов и просто блокировка потока будет оптимальным решением?