【发布时间】:2019-05-25 09:45:07
【问题描述】:
我正在构建一个使用套接字连接到服务器的桌面应用程序。我有一个用户列表,我需要每个用户独立连接到该服务器
foreach 循环:
foreach (var account in accounts)
{
Connect(account, server);
}
问题是,假设我有 200 个帐户,Connect() 需要 2 秒才能运行,而考虑 foreach 循环则需要 6 分钟以上。
连接函数示例:
private void Connect(User user, Server server)
{
connection = new Connection($"{server.Ip}:{server.Port.ToString()}", user);
connection.Connect(); // await
connection.WaitToConnect(); // await
connection.SendData(); // await
connection.SendAnotherData(); // await
connection.WaitCallBack(); // await
if(connection.everythingFine) // From here connection is "completed" but can't be closed
{
}
// Trigger my event handler on disconnect
connection.Disconnected += disconnectionHandler;
}
由于 Connect() 是同步的,并与事件处理程序等创建持久连接。我担心使用线程以及它可能对我的套接字连接和事件处理程序造成什么影响。
编辑:
问题是:在这种情况下,如何在我的 foreach 循环中实现线程化?
【问题讨论】:
-
语言? C# 最好对每个使用并行。它将使用线程池/任务池。任务比线程更细。您也可以尝试非阻塞线程安全列表或连接。
-
理想情况下,在这个现代时代,不要考虑线程。查看异步方法,并为每个客户端提供某种“状态”对象,异步调用的回调/延续可以访问。让框架/操作系统为您提供线程、调度等操心。
-
Connection 是基于套接字或类似东西构建的自定义类吗?
-
@Damien_The_Unbeliever 你介意写一个简短的代码解释吗?我是一名 Javascript 开发人员,所以异步是我的工作,但我 2 天前刚刚开始 C# 的个人项目,所以我只是潜入其中。
标签: c# .net multithreading sockets foreach