多个BackgroundWorkers c#

时间:2013-04-25 06:53:58

标签: c# multithreading asynchronous backgroundworker

我有一个使用两个BackgroundWorkers的服务器应用程序:

1)用于不断检查SVN存储库是否已更新。

2)用于管理进程队列。

BackgroundWorker revisionsWorker = new BackgroundWorker();
revisionsWorker.DoWork += (queueSender1, queueEvent1) => checkRevision();
revisionsWorker.RunWorkerAsync();

BackgroundWorker queueWorker = new BackgroundWorker();
queueWorker.DoWork += (queueSender2, queueEvent2) => manageComputersQueue();
queueWorker.RunWorkerAsync();

更新SVN时,函数checkRevision()更新本地存储库,运行一些脚本,并使用devenv.com编译解决方案。 queueWorker检查服务器是否正忙于运行checkRevision()。如果它不忙,它会根据队列中的位置运行进程。

我的问题是,如果SVN已更新,并且checkRevision()正在运行(需要一些时间......),则manageComputersQueue()不会被访问,直到checkRevision()完成

意思是,我希望manageComputersQueue()始终运行,如果服务器忙于执行其他任务,它将通知客户端服务器当前正忙。

当1个背景工作者正在做某些事情时,其他背景工作者是否有可能等待它完成,即使它们都是异步运行的?

2 个答案:

答案 0 :(得分:0)

您可以使用BackgroundWorker + *ResetEvent执行此操作,但它会有点笨拙。

考虑使用Task.ContinueWith

答案 1 :(得分:0)

您似乎没有订阅RunWorkerCompleted事件 - 这意味着您没有任何内容可以向UI线程报告。 在这种情况下,只需使用Task.Factory.StartNew

Task.Factory.StartNew( () => checkRevision() )
Task.Factory.StartNew( () => manageComputersQueue() )

除非你在这些方法中有一些明确的逻辑阻塞彼此,否则它们不应相互冲突。