这个 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,但我只是想检查一下。
list和listener的访问都是线程安全的。
clients
列表在完全构建之前不能被其他任何人访问和访问。在等待的 task/method 完成之前,等待之后的任何代码都不会执行。
对于listener
,它几乎相同,但方向相反。该实例被传递给 getTcpClients()
方法,但任何其他访问都被阻止,直到该方法停止使用该实例。
我使用 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,但我只是想检查一下。
list和listener的访问都是线程安全的。
clients
列表在完全构建之前不能被其他任何人访问和访问。在等待的 task/method 完成之前,等待之后的任何代码都不会执行。
对于listener
,它几乎相同,但方向相反。该实例被传递给 getTcpClients()
方法,但任何其他访问都被阻止,直到该方法停止使用该实例。