【问题标题】:How to manage multithread c# application如何管理多线程 C# 应用程序
【发布时间】:2023-04-04 02:11:01
【问题描述】:

我有以下场景:

C# 应用程序 (.net 4.0/4.5),具有 5-6 个不同的线程。每个线程都有不同的任务,每 x 秒启动一次(范围从 5 到 300)。

每个任务都有以下步骤:

  1. 从 Sql Server 获取项目
  2. 在 Json 中转换项目
  3. 向网络服务器发送数据
  4. 等待服务器回复。

由于此任务在某些时候可能会失败(互联网问题、超时等),.NET 世界中的最佳解决方案是什么?

我想过以下解决方案:

  • 每 x 秒产生一次新线程(如果没有其他此类线程正在执行)
  • 为每种类型的任务生成一个线程并每 x 秒循环一次步骤(以了解管理异常的方式)

哪个更安全、更健壮?应用程序将在无人值守的系统上运行,因此无论任何可能的异常情况,它都应该能够继续执行。

【问题讨论】:

  • 我的第一个问题是要真正确定是否真的需要多线程,因为它确实增加了进入的重大障碍和可维护性问题。感知到的性能提升几乎从未存在。如果您使用多线程来提供响应式 UI,则应首先考虑 async/await,这会降低复杂性。
  • 我认为TPL Dataflow 是解决此问题的正确工具。在 SO 上有一些很好的使用示例。

标签: c# multithreading


【解决方案1】:

创建线程非常昂贵。第一个选项不是一个好选项。如果“做事”的周期很短(在停顿之间),您可以考虑使用ThreadPool 或 TPL。如果线程大部分时间都很忙,或者工作花费了相当长的时间,那么专门的工作人员更合适。

至于异常:不要让异常逃脱工作人员。你必须抓住他们。如果这意味着您放弃并在几秒钟内重试,那可能没问题。

【讨论】:

  • 您能否详细说明未捕获工人异常的含义?
  • 我不想告诉你,但是“每隔几秒一个线程” - 线程并不昂贵,它会有所作为。一点也不。
  • @TomTom 堆栈本身就是一个 MB ;p 但我的意思是,通常有更合适的方法来处理工作,这取决于所涉及工作的概况跨度>
  • @MarcGravell 我从来没有说过它们很便宜,但是如果你必须每 5 秒生成一个线程来检查某些东西,那么“昂贵”就是个笑话。 1mb 与大多数应用程序的功能无关。
  • 关于在 worker 上捕获异常:通用 try {} catch (Exception ex) 在 c# 中捕获所有可能的异常,对吧?
【解决方案2】:

您可以使用生产者消费者模式方法对整个事物进行建模。您有一个生产者将新任务描述放入队列中,并且您可以有多个从队列中处理的消费者(4 或 5 个线程)。消费者或处理线程的数量可能会因负载、队列长度而异。

每个任务都涉及从数据库读取、转换格式、发送到网络服务器,然后处理来自网络服务器的响应。我假设每个任务都会完成所有这些步骤。

如果队列中的项目出现异常,您可能会将队列项目标记为失败并安排稍后重试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2013-04-11
    • 2014-03-15
    • 1970-01-01
    相关资源
    最近更新 更多