这个Tcp async / await代码被认为是线程安全的吗?

时间:2017-01-31 04:01:11

标签: 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(() => 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 个答案:

答案 0 :(得分:1)

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

在完全构建列表之前,其他任何人都无法访问clients列表。在等待任务/方法完成之前,await之后的任何代码都不会执行。

对于listener它几乎是相同但反方向。该实例将传递给getTcpClients()方法,但阻止任何其他访问,直到此方法停止使用该实例。