2017-01-31 34 views
-2

我寫了使用的TcpListener和一些代碼異步/等候一項將等待3個客戶端連接到服務器,將它們添加到列表,然後做一些與客戶:這個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; 
} 

我所關心的是是否可以爲客戶端使用List而不是線程安全的集合,因爲await可能會在其他線程上恢復。此外,只是想知道我的TcpListener用法是否也是線程安全的。

我沒有看到問題,因爲沒有兩個線程同時訪問列表或TcpListener,但只是想我會檢查。

回答

1

對列表和偵聽器的訪問都是線程安全的。

clients列表不被其他人訪問和訪問,直到列表被完全構建。等待後的任何代碼都不會執行,直到等待完成的任務/方法完成。

對於listener它幾乎相同,但方向相反。該實例傳遞給getTcpClients()方法,但其他任何訪問都將被阻止,直到此方法停止與該實例一起工作。