【问题标题】:For loop of sockets with threads带线程的套接字循环
【发布时间】: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


【解决方案1】:

不必害怕线程。我不太了解您的代码来建议更复杂的方法,但您可以为每个帐户启动一个线程:

foreach (var account in accounts)
{
    var t = new Thread((aObj) => Connect ((Account)aObj, server));
    t.Start(account);
}

【讨论】:

  • Tasks 和 await async 更轻松,也可以正常工作。
  • 不太相信在他的情况下他们会这样做。如果connection.WaitCallBack(); 阻塞直到收到调用或类似的事情,他将很快耗尽线程池,nothing 将起作用。
  • Connection 出现一个自定义类。在这一点上,我们不知道是否有异步变体,或者可能轮询或是否可以更改以支持这些。这个问题让我相信异步变体是可用的。
  • 这纯属猜测。由于我们不知道更多,我更愿意保持安全并建议线程。当然,最好的还是作者能多点说明。 :-)
  • 同意。在我们了解更多之前,我们要不要 VtC?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多