【问题标题】:Blocking tasks until previous task has completed阻塞任务直到前一个任务完成
【发布时间】:2012-07-11 10:32:42
【问题描述】:

我有一个程序正在监视文件的变化,然后在发生变化时处理更新。

我需要能够同时处理不同文件的更改,但只能按顺序处理同一个文件中的更改。

每个文件都有一个唯一的 id,所以目前我正在使用 ConcurrentDictionary 来监控当前正在处理和阻塞哪些任务,直到可以处理第二个更新:

private ConcurrentDictionary<int, ITask> activeTasks = 
    new ConcurrentDictionary<int, ITask>();

public bool TryProcessTask(ITask task)
{
    while(activeTasks.ContainsKey(task.Id))
    {
        Thread.Sleep(50);
    }

    activeTasks.TryAdd(task.Id, task);
    bool isProcessed = task.TryProcess();

    ITask t;

    activeTasks.TryRemove(task.Id, out t);

    return isProcessed;
}

我想知道是否有人能够告诉我一个更好的方法来做到这一点?

我会假设会有一个特定的 .NET 对象来满足这种情况?

谢谢,

编辑

为了澄清,我正在寻找类似于队列的东西,我可以将项目传递给它,如果没有其他具有相同 ID 的项目将处理,否则它将阻塞,直到具有相同 ID 的现有进程结束了。

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    使用任务并行库..

    Task.Factory.StartNew(METHOD).ContinueWith(task => DispatcherHelper.Dispatch(() => { Mouse.OverrideCursor = null; }));

    它将首先完成第一个任务,然后仅使用 continuewith

    开始新任务

    【讨论】:

    • 如果这不适合你尝试并行库中的其他东西,它正是为我们程序员创建的,以停止使用各种组合,如睡眠
    • 对不起,我应该提到应用程序已经线程化。所以这不是问题。我一直在寻找更像一个队列的东西,我可以将项目传递给它,如果没有其他具有相同 ID 的项目将处理,否则它将阻塞,直到具有相同 ID 的现有进程完成。
    【解决方案2】:

    如果你想要异步调用,你可以使用 Task.Factory.Startnew() 否则使用 Parallel.ForEach() 。希望这会有所帮助.. herehere

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2012-01-16
      相关资源
      最近更新 更多