【问题标题】:Multiple BackgroundWorkers c#多个BackgroundWorkers c#
【发布时间】:2013-04-25 06:53:58
【问题描述】:

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

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

【问题讨论】:

  • 后台工作人员是否在使用共享资源(例如用于报告进度的 UI 线程、文件、锁……)?
  • 有一个全局布尔值表明服务器还活着m_serverAlivecheckRevision()manageComputersQueue() 都运行在:while (m_serverAlive) 循环中。他们不共享其他资源。
  • 你有没有看过这个问题:stackoverflow.com/questions/10694271/…(未完成)

标签: c# multithreading asynchronous backgroundworker


【解决方案1】:

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

考虑使用Task.ContinueWith

【讨论】:

  • 我认为 Task.ContinueWith 会等待其中一个完成然后运行第二个,对吗?如果是这样,那么这不是我想要实现的。我希望它们始终异步运行——这意味着即使其中一个很忙,另一个仍在运行。这可能吗?
  • 是的,没错。它将创建一个任务链。我想我没有得到它,这不是你想要达到的吗?你说“是否有可能当 1 个后台工作人员正在做一些事情时,其他后台工作人员正在等待它完成,即使它们都异步运行?”
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多