这个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()
方法,但其他任何访问都将被阻止,直到此方法停止与该实例一起工作。