这个Tcp异步/等待代码被认为是线程安全的吗?

问题描述:

我写了使用的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,但只是想我会检查。

对列表和侦听器的访问都是线程安全的。

clients列表不被其他人访问和访问,直到列表被完全构建。等待后的任何代码都不会执行,直到等待完成的任务/方法完成。

对于listener它几乎相同,但方向相反。该实例传递给getTcpClients()方法,但其他任何访问都将被阻止,直到此方法停止与该实例一起工作。