【发布时间】:2017-09-25 21:06:00
【问题描述】:
我正在运行一个事件驱动的 Windows 服务,每个事件都由它自己的线程处理。现在,这些事件通常以每秒 10 次左右的速度发生。事件的最后一个动作是将数据保存到数据库中。
如果保存数据失败,因为无法建立与数据库的连接,我希望遇到此问题的第一个线程以某个时间间隔(例如每 30 秒)启动一个新的重新连接任务。我希望简单地结束任何以下线程。任何时候都应该只运行一个重新连接的任务。
如何编写代码以使以下事件线程安全地知道已经有一个重新连接任务正在运行并结束它的生命?也许有一个很好的设计模式?
编辑: 遵循 FelixD 的建议链接:取消取消令牌会触发任务中的异常吗?
如果是这样,我可能会捕捉到异常,所以它会保存传入的 文件中的数据,而不是将其提交到数据库。我试图搜索这个,但我不清楚当任务被取消时会发生什么。
【问题讨论】:
-
@FelixD。如果我正确理解了这个想法,启动重新连接作业的第一个线程会取消其他正在运行的线程吗?据我了解取消令牌,线程将停止“工作中”。在我的场景中,我想在事件被取消之前保存数据(并在连接建立时提交)。我可以使用取消令牌来完成此操作吗?
-
我想是的..this 也对你有帮助吗?
-
为什么要让第一个线程尝试重新连接并处理所有其他线程?处理所有线程然后启动一个检查连接的新线程是否同样有效?
-
@Mr.Blonde 你不应该为所有线程保持一个连接。在
using块内根据需要打开连接。 ADO.NET 使用连接池,因此您不必每次都打开一个新连接。通过尝试使用全局连接,您最终会损害性能和可伸缩性,因为锁会累积并导致过度阻塞和等待
标签: c# multithreading task