0

环境:.NET 4.0 C#

我有多个正在运行的异步生成器。它们生成IResult对象、检查通用标准并将结果推送到共享集合。生成器必须支持取消和进度报告。

这是一个伪代码:

private Dictionary<string, IResult> resultCollection;
private ICriteria criteria;
private bool isCancelled;

// Multiple Running Generators
private GeneratingAsync(ICriteria criteria)
{
    while (!isCancelled)
    {
        IResult result = GenerateResultAsync();

        if (CheckCriteria(result, criteria))
            OnResultAvailable(this, new ResultEventArgs(result));
        OnProgressChanged(this, new ProgressEventArgs(...));
    }
}

private void OnResultAvailable(object sender, ResultEventArgs e)
{
    // Push result object
    if(!resiltCollection.Contains(e.Id))
        resiltCollection.Add(e.Id, e.Result)
    ...
}

private void OnProgressChanged(object sender, ProgressEventArgs e)
{
    ...
}

在我当前的项目中,我使用了一个通过 BackGroundWorker 实现的生成器。我的问题是多个异步生成器使用什么模式:

  • 我阅读了观察者设计模式,但 MS 推荐它用于一个生成器和多个观察者,这不是我的情况。
  • 事件模式
  • 反应式扩展
  • ...

另外,我可以使用多个 BackGroundWorkers 还是使用任务更好?

编辑:

什么更好resultCollection:ConcurrentDictionary 或 Dictionary 正确锁定AddResult()GetResult()方法?

4

0 回答 0