如何管理多线程c#应用程序
本文关键字:多线程 应用程序 管理 何管理 | 更新日期: 2023-09-27 17:53:30
我有以下场景:
c#应用程序(.net 4.0/4.5),有5-6个不同的线程。每个线程都有一个不同的任务,每x秒启动一次(范围从5到300)。每个任务有以下步骤:
- 从Sql Server获取项目
- 将项目转换为Json
- 发送数据到web服务器
- 等待服务器回复。
既然这个任务在某些时候会失败(网络问题,超时等),那么。net世界的最佳解决方案是什么?
我考虑了以下解决方案:
- 每x秒生成一个新线程(如果没有其他线程正在执行)
- 为每种类型的任务生成一个线程,并每x秒循环一次步骤(以了解管理异常的方式)
哪个更安全更健壮?应用程序将在无人值守的系统上运行,因此无论出现任何可能的异常,它都应该能够保持执行状态。
线程的创建成本非常高。第一个选择不是很好。如果"做事情"的周期很短(停顿之间),您可以考虑使用ThreadPool
或TPL。如果线程大部分都很忙,或者工作占用了可观的时间,那么使用专用的worker更合适。
对于异常:不要让异常脱离工作线程。你必须抓住他们。如果这意味着你要放弃并在几秒钟后重新尝试,那也没什么。
您可以使用生产者-消费者模式方法对整个事情进行建模。您有一个生产者将新的任务描述放入队列中,您可以有多个消费者(4或5个线程)从队列中进行处理。消费者或处理线程的数量可能会根据队列的负载和长度而变化。
每个任务包括从数据库读取,转换格式,发送到web服务器,然后处理来自web服务器的响应。我假设每个任务都会执行所有这些步骤。
如果队列中的项出现异常,您可能会将该队列项标记为失败,并将其安排为稍后重试。