2017-01-31 5 views
-2

Ich schrieb einige Code TcpListener mit und Asynchron/await die wartet für 3-Clients mit dem Server verbinden, fügen Sie sie in eine Liste, dann mit den Kunden etwas tun:Wird dieser Tcp-async/-Award-Code als threadsicher angesehen?

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; 
} 

Was ich bin besorgt über ist ob es in Ordnung ist, eine Liste für die Clients anstelle einer threadsicheren Sammlung zu verwenden, da die Wartezeit möglicherweise auf einem anderen Thread fortgesetzt wird. Ich frage mich auch, ob meine TcpListener-Verwendung auch Thread-sicher ist.

Ich sehe kein Problem, da keine zwei Threads jemals auf die Liste oder den TcpListener gleichzeitig zugreifen, sondern nur gedacht, dass ich es überprüfen würde.

Antwort

1

Die Zugriffe auf Listen und Listener sind threadsicher.

Die Liste clients wird von niemandem aufgerufen und zugänglich, bis die Liste vollständig erstellt wurde. Jeder Code nach dem Warten wird nicht ausgeführt, bis die erwartete Aufgabe/Methode abgeschlossen ist.

Für die listener ist es ziemlich gleich, aber in entgegengesetzter Richtung. Die Instanz wird an die Methode getTcpClients() übergeben, aber jeder andere Zugriff ist blockiert, bis diese Methode nicht mehr mit der Instanz arbeitet.

Verwandte Themen