2017-01-31 17 views
-2

Я написал код, используя TcpListener и асинхронное/Await, который будет ждать 3 клиента для подключения к серверу, добавьте их в список, а затем сделать что-то с клиентами:Является ли этот код async/awc Tcp считаться потокобезопасным?

private async void button1_Click(object sender, EventArgs e) 
{ 
    var listener = new TcpListener(IPAddress.Any, 6015); 
    listener.Start(); 
    var clients = await Task.Run(() => GetTcpClients(listener)); 

    // Do something with clients 

    listener.Stop(); 
} 

private static async Task<List<TcpClient>> GetTcpClients(TcpListener listener) 
{ 
    var clients = new List<TcpClient>(); 
    var clientsMaxReached = false; 

    while (!clientsMaxReached) 
    { 
     var client = await listener.AcceptTcpClientAsync(); 
     clients.Add(client); 
     if (clients.Count == 3) 
      clientsMaxReached = true; 
    } 

    return clients; 
} 

Что я беспокою можно ли использовать список для клиентов вместо поточно-безопасной коллекции, так как ожидание может возобновиться в другом потоке. Кроме того, просто интересно, является ли использование TcpListener безопасным потоком.

Я не вижу проблемы, так как ни один из двух потоков никогда не будет иметь доступ к списку или TcpListener в одно и то же время, но просто думал, что я проверю.

ответ

1

Оба доступа к списку и слушателю являются потокобезопасными.

clients список не доступен и недоступен никому другому, пока список не будет полностью построен. Любой код после ожидания не будет выполняться до тех пор, пока ожидаемая задача/метод не будет завершена.

Для listener это почти то же самое, но в противоположном направлении. Экземпляр передается методу getTcpClients(), но любой другой доступ блокируется до тех пор, пока этот метод не перестанет работать с экземпляром.

 Смежные вопросы

  • Нет связанных вопросов^_^