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

C# 这个Tcp异步/等待代码被认为是线程安全的吗?,c#,multithreading,asynchronous,thread-safety,tcplistener,C#,Multithreading,Asynchronous,Thread Safety,Tcplistener,我使用TcpListener和async/await编写了一些代码,它们将等待3个客户端连接到服务器,将它们添加到列表中,然后对客户端执行一些操作: private async void button1_Click(object sender, EventArgs e) { var listener = new TcpListener(IPAddress.Any, 6015); listener.Start(); var clients = await Task.Run(

我使用TcpListener和async/await编写了一些代码,它们将等待3个客户端连接到服务器,将它们添加到列表中,然后对客户端执行一些操作:

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;
}
private async void按钮1\u单击(对象发送方,事件参数e)
{
var listener=newtcplistener(IPAddress.Any,6015);
listener.Start();
var clients=wait Task.Run(()=>GetTcpClients(listener));
//和客户做点什么
listener.Stop();
}
专用静态异步任务GettCPClient(TcpListener侦听器)
{
var clients=newlist();
var clientsmaxreach=false;
而(!clientsmaxreach)
{
var client=await listener.AcceptTcpClientAsync();
客户。添加(客户);
如果(clients.Count==3)
clientsmaxreach=true;
}
返回客户;
}
我所关心的是,是否可以为客户端使用列表而不是线程安全的集合,因为等待可能会在不同的线程上继续。另外,我想知道我的TcpListener使用是否也是线程安全的


我看不出有什么问题,因为没有两个线程会同时访问列表或TcpListener,但我只是想检查一下。

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

在完整构建列表之前,
客户机
列表不会被任何其他人访问。等待后的任何代码都不会执行,直到等待的任务/方法完成

对于
监听器来说
几乎相同,但方向相反。该实例被传递给
getTcpClients()
方法,但任何其他访问都会被阻止,直到该方法停止使用该实例