C# 一个采集器和多个生成器的多任务模式

C# 一个采集器和多个生成器的多任务模式,c#,.net,design-patterns,multitasking,C#,.net,Design Patterns,Multitasking,环境:.NET 4.0 C# 我有多个异步运行的发电机。它们生成IResult对象,检查公共条件并将结果推送到共享集合。生成器必须支持取消和进度报告 下面是一个伪代码: private Dictionary<string, IResult> resultCollection; private ICriteria criteria; private bool isCancelled; // Multiple Running Generators private GeneratingA

环境:.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)
{
    ...
}
私有字典结果集合;
私人ICriteria标准;
取消私人住宅;
//多台运行发电机
专用生成同步(ICriteria标准)
{
而(!已取消)
{
IResult result=GenerateResultAsync();
if(检查标准(结果、标准))
OnResultAvailable(这是新的ResultEventArgs(结果));
OnProgressChanged(这是新的ProgressEventArgs(…);
}
}
private void OnResultAvailable(对象发送方,ResultEventArgs e)
{
//推送结果对象
如果(!resilCollection.Contains(e.Id))
resilCollection.Add(e.Id,e.Result)
...
}
私有void OnProgressChanged(对象发送方,ProgressEventArgs e)
{
...
}
在我当前的项目中,我使用一个用BackGroundWorker实现的生成器。我的问题是多个异步生成器使用什么模式:

  • 我读过有关观察者设计模式的文章,但MS建议将其用于一个生成器和多个观察者,这不是我的情况
  • 事件模式
  • 反应性扩展
另外,我可以使用几个后台工作人员,还是使用任务更好

编辑:


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

我不理解您试图解决的问题。你能更详细地描述一下这个问题,而不是你认为应该如何解决它吗?问题是我必须异步生成多个对象。这些对象必须满足预定义的标准。生成并检查对象后,必须将其存储在集合中。所以我需要几个生成器同时工作,并通过取消和进度报告推送结果。结果收集必须是线程安全的。同样,您描述的是解决方案,而不是问题。你想解决什么问题?(不是你怎么解决的。)@Enigmativity,我想为外汇市场制定交易策略。我不想听起来很难,但这不是真正的问题,它更像是一个标题,而不是一个描述。