簡體   English   中英

這個 Tcp async/await 代碼被認為是線程安全的嗎?

[英]Is this Tcp async/await code considered thread safe?

我使用 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,但只是想我會檢查。

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

在完全構建列表之前,任何其他人都無法訪問和訪問clients列表。 在等待的任務/方法完成之前,await 之后的任何代碼都不會執行。

對於listener來說,它幾乎相同,但方向相反。 該實例被傳遞給getTcpClients()方法,但在此方法停止使用該實例之前,任何其他訪問都會被阻止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM