首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理C#服务中的死锁

处理C#服务中的死锁
EN

Stack Overflow用户
提问于 2012-08-21 19:59:26
回答 4查看 729关注 0票数 1

我在C#中有一个服务,它从oracle DB中提取记录并插入到MySql DB中,在成功插入MySql DB中的所有记录后,我的Oracle DB中的一列得到了更新,即这些记录已被插入。

因为它是一项服务,每隔5秒就会被调用一次。

我的问题是,在这种情况下,我应该如何处理死锁情况。例如,我的服务从oracle DB中获取大约20,000条记录,并尝试插入到Oracle中,这需要大约7-8秒的时间,也就是说,当我的服务将被调用时,由于上一次会话的所有记录都不会被插入,所以在MySql DB中不会有更新,下一次它将再次获取整个记录,这是我不想要的。

如果可能,也提供一些相同的代码。这是纯基于窗口的服务,而不是WCF。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-21 20:50:38

如果您只在此服务中需要“协调”,则使用AutoResetEvent类。

  1. 使用定时器实例创建静态字段。定时器调用的方法应在启动时通过AutoResetEvent.WaitOne(TimeSpan timeout)调用检查此实例。
  2. 在您的方法(由定时器调用)结束时 AutoResetEvent.Set()。

{} finally{}构造对于此调用通常是可以的。在服务启动期间,为创建的实例调用AutoResetEvent.Set()以允许方法(由计时器调用)开始工作。

使用具有小超时的WaitOne(TimeSpan超时)允许在前一个定时器还未结束时快速完成定时器“调用”。所以你仍然可以每隔5秒调用你的方法。

当然,在调用它的方法之前,需要检查AutoResetEvent处理,也许还需要一些额外的检查……

票数 0
EN

Stack Overflow用户

发布于 2012-08-21 20:06:47

我不知道您的功能需求是什么,但听起来您并不是真的想在服务中开始处理,直到之前的任何运行都完成之后。也就是说,您需要某种类型的系统来告知退出运行是否正在进行,然后在启动后续进程之前对此进行检查。另一种选择是将请求排队,然后将它们作为批处理进行处理,从而有效地删除重复项。

票数 0
EN

Stack Overflow用户

发布于 2012-08-21 20:07:10

听起来您需要等待插入到Oracle中的操作完成,因此在c#中对请求进行排队,即同步执行它们。研究如何使用Mutex对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12054367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档