环境:.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()
方法?