2009-06-15 42 views
1

我使用backgroundworker对象在需要的地方执行一些异步和线程操作。每当我运行背景工作者时,它会在跑步中间停顿并且没有完成。它通常会在我同时运行多个背景工作器时执行此操作。在C中检测一个停顿的BackgroundWorker#

我想要做什么,当它停止是取消操作并重新运行它。我的问题是我不知道如何检测它何时停止。是否有一些我需要添加的代码来“通知”工作人员已经停工或者没有办法知道?

谢谢,

回答

4

你应该调试你的代码并且找出为什么它的拖延

  • 您是否有多线程死锁?
  • 资源池是否耗尽?
  • 您是否在无限期等待网络资源?
  • 是一个异常抛出中间进程?

的BackgroundWorker提供了以下回调:

  • DoWork的,你的工作开始之前被调用。
  • RunWorkerCompleted,当您的工作完成时调用它。

如果您希望为异步操作强制实施某种服务级别,那么您可以使用包装器对此进行扩展以记录警告,如果操作花费的时间超过一定时间。 (例如,当DoWork被调用时启动一个计时器,当计时器经过时记录警告,完成时清除计时器)

2

这完全取决于你的意思是“停滞”。如果你设法使工作线程死锁,那么你需要找到问题并解决问题。如果抛出异常,那么应该触发RunWorkerCompleted事件,并在事件参数中使用非空Error

+0

RunWorkerCompleted不会被调用。你和sambo对僵局有同样的想法,所以我要检查一下。谢谢。 – Phillip 2009-06-15 04:31:42

+0

Marc,我更新了我的答案,仍然认为RunWorkerAsync上有一个丢失覆盖,它应该允许您指定一个超时,以便更容易执行SLA。此外,我喜欢传递动作比订阅事件好,如果感觉不到副作用,但它只是个人的品味。 – 2009-06-15 08:47:31