0

我有一个使用两个 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 个后台工作人员正在做一些事情时,其他后台工作人员正在等待它完成,即使他们都异步运行?

4

2 回答 2

0

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

考虑使用Task.ContinueWith

于 2013-04-25T06:57:26.553 回答
0

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

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

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

于 2013-04-26T22:42:43.480 回答