async / await или Begin / End с помощью TcpListener?
Мы начали создавать tcp-сервер, который сможет принимать множество клиентов и одновременно получать от всех клиентов новые данные.
До сих пор я использовал IOCP для tcp-серверов, что было довольно легко и удобно, но на этот раз я хочу использовать технологию Async / Await. это было выпущено в C # 5.0.
Проблема в том, что когда я начал писать сервер с использованием async / await, я понял, что в случае использования многопользовательского сервера tcp используется технология async / await. и обычные методы синхронизации будут работать одинаково.
Вот'Вот простой пример, чтобы быть более конкретным:
class Server
{
private TcpListener _tcpListener;
private List _clients;
private bool IsStarted;
public Server(int port)
{
_tcpListener = new TcpListener(new IPEndPoint(IPAddress.Any, port));
_clients = new List();
IsStarted = false;
}
public void Start()
{
IsStarted = true;
_tcpListener.Start();
Task.Run(() => StartAcceptClientsAsync());
}
public void Stop()
{
IsStarted = false;
_tcpListener.Stop();
}
private async Task StartAcceptClientsAsync()
{
while (IsStarted)
{
// ******** Note 1 ********
var acceptedClient = await _tcpListener.AcceptTcpClientAsync();
_clients.Add(acceptedClient);
IPEndPoint ipEndPoint = (IPEndPoint) acceptedClient.Client.RemoteEndPoint;
Console.WriteLine("Accepted new client! IP: {0} Port: {1}", ipEndPoint.Address, ipEndPoint.Port);
Task.Run(() => StartReadingDataFromClient(acceptedClient));
}
}
private async void StartReadingDataFromClient(TcpClient acceptedClient)
{
try
{
IPEndPoint ipEndPoint = (IPEndPoint) acceptedClient.Client.RemoteEndPoint;
while (true)
{
MemoryStream bufferStream = new MemoryStream();
// ******** Note 2 ********
byte[] buffer = new byte[1024];
int packetSize = await acceptedClient.GetStream().ReadAsync(buffer, 0, buffer.Length);
if (packetSize == 0)
{
break;
}
Console.WriteLine("Accepted new message from: IP: {0} Port: {1}\nMessage: {2}",
ipEndPoint.Address, ipEndPoint.Port, Encoding.Default.GetString(buffer));
}
}
catch (Exception)
{
}
finally
{
acceptedClient.Close();
_clients.Remove(acceptedClient);
}
}
}
Теперь, если вы видите строки подПримечание 1 ' а также 'Заметка 2', Он может быть легко изменен на:
Примечание 1 от
var acceptedClient = await _tcpListener.AcceptTcpClientAsync();
в
var acceptedClient = _tcpListener.AcceptTcpClient();
И Примечание 2 от
int packetSize = await acceptedClient.GetStream().ReadAsync(buffer, 0, 1024);
в
int packetSize = acceptedClient.GetStream().Read(buffer, 0, 1024);
И сервер будет работать точно так же.
Итак, зачем использовать async / await в слушателе tcp для нескольких пользователей, еслиЭто то же самое, что использовать обычные методы синхронизации?
Должен ли я продолжать использовать IOCP в этом случае? потому что для меня этоЭто довольно легко и удобно, но я боюсь, что он будет устаревшим или даже более недоступным в новых версиях .NET.