我运行的Windows服务是事件驱动的,每个事件都由自己的线程处理。现在事件通常以每秒10左右的速度发生。事件的最后一个操作是将数据保存到数据库。
如果保存数据失败,因为无法建立与数据库的连接,我希望遇到此问题的第一个线程启动以某个间隔(例如每30秒)运行的新重新连接任务。我希望简单地结束以下任何线程。任何时候都应该只运行一个重新连接的任务。
我如何进行编码,以便以下事件线程安全地知道已经有一个重新连接任务正在运行并结束它的生命?也许这有一个很好的设计模式?
编辑:关注FelixD建议的链接:取消取消令牌是否会触发任务中的异常?
如果是这样,我可能会捕获异常,因此它会保存传入 文件中的数据,而不是将其提交到数据库。我试图搜索这个,但我不清楚当一个任务被取消时会发生什么。
答案 0 :(得分:2)
我建议创建一个BlockingCollection,以及一个持续监视它的工作线程。当其中一个接收者线程收到消息时,它会处理该消息,然后将其写入BlockingCollection
,而不是尝试将其写入数据库。
监视BlockingCollection
的工作线程可以与数据库建立单个持久连接,并可以编写单个记录,或批量处理以进行批量更新,或者将记录写入文件(如果数据库连接)由于某种原因失败了。
这种事情很容易设置直接使用BlockingCollection
,或者您可以使用TPL Dataflow。
答案 1 :(得分:0)
数据库连接丢失通常被描述为瞬态故障。通常会发生这种情况,因为数据库无法为正在抛出的流量提供服务,因此它开始拒绝或超时连接。
你是否真的发现过这种错误或是你先发制人?
您应该通过等待一段时间然后重试该操作多次来处理瞬态故障,包括打开新连接。为所有线程执行此操作。如果所有重试都失败,请准备好回退到已知状态并返回错误。
我发现Polly(由.Net基金会)对于以结构化方式处理这种行为非常有用。 http://www.thepollyproject.org/