【问题标题】:Thread Management in C# Socket ProgrammingC# Socket 编程中的线程管理
【发布时间】:2012-03-23 08:17:40
【问题描述】:

我有一个 TCP 套接字应用程序,客户端同时向服务器发送巨大的字符串消息。服务器获取这些消息将它们写入 Access DB。所以如果有这么多客户端服务器端无法正确处理每个客户端并且有时服务器会自行关闭。

如果队列中有另一个客户端,在发送消息等待队列之前,有什么方法可以告诉客户端的线程?有了这个服务器就不需要同时处理例如30个客户的需求。

例如;

  1. 客户端发送消息 => 服务器处理 1 个客户端的需求
  2. 客户端正在等待 1 个客户端的请求完成,而不是 2 个客户端发送消息 => 服务器正在处理 1 个客户端的请求
  3. 客户正在等待 2 个客户的要求完成。

我的问题是在我使用 access db 时出现的。在打开访问连接时,将数据保存到表中并关闭数据库需要时间,并且服务器会出现问题:) 如果我不使用访问数据库,我可以毫无问题地收到大量消息。

【问题讨论】:

    标签: c# multithreading sockets asynchronous


    【解决方案1】:

    我认为您应该考虑为您的应用程序使用 Web 服务器,并用 HTTP 替换您的协议。无需在 TCP 流上发送大量字符串,只需使用您最喜欢的 HttpClient 类将字符串 POST 到服务器。

    通过迁移到 HTTP,您或多或少地解决了所有性能问题。 Web 服务器已经知道如何处理多个长请求,因此您无需担心。由于您要发送大字符串,因此 HTTP 开销不会影响您的性能。

    【讨论】:

    • 我的问题不在于大字符串。如果我不将传入的字符串消息写入 Access DB,则没有问题。当我使用 access db 时会出现问题。虽然打开访问连接将数据保存到表中并关闭数据库需要时间,但服务器会出现问题:)
    • 如果您使用成熟的 Web 应用程序服务器(如 IIS 和 ASP.NET),则不会。这一切都已经为您解决了。
    【解决方案2】:

    是的,您可以这样做,但这不是最有效的方法。您的方案是单线程的。

    您要做的是创建一个线程池并接受来自多个客户端的消息并将它们作为单独的线程处理。 如果那太复杂了。您可以在您的服务器中拥有一个生产者消费者队列,所有传入的消息都将存储在一个队列中,而您的服务器将按照先到先服务的原则处理它们。

    【讨论】:

      猜你喜欢
      • 2016-07-27
      • 1970-01-01
      • 2017-04-27
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多