[英]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.