gpt4 book ai didi

c# - 多个操作的并行化和结果的连接

转载 作者:太空狗 更新时间:2023-10-30 00:43:22 24 4
gpt4 key购买 nike

我想在 Silverlight 5.0 应用程序中使用任务并行库(SL5 有任务工厂但没有 Parallel.For)实现以下内容。我有很多线程知识,但没有关于 TPL 的知识,所以这似乎是一个很好的任务:)

目前我有一些代码,同步执行如下:

public interface IProcessor
{
IEnumerable<Bar> Provide(Foo param)
}

private IEnumerable<IProcessor> processors;

public void DoMultiOperations(Foo param, Action<IEnumerable<Bar>> callback)
{
List<Bar> allResults = new List<Bar>();

foreach(var processor in this.processors)
{
allResults.AddRange(processor.Provide(param));
}

callback(allResults);
}

考虑每个 IProcessor接受 Foo参数 Provide返回 IEnumerable<Bar> .所有结果的聚合通过回调发送回调用者。

现在一些 IProcessor 立即执行。有些人向服务器发出调用,可能需要几秒钟。我想为 N IProcessor 安排 N 个任务实例并且当所有实例都完成(或超时)时连接 IEnumerable<Bar>结果。

如果可能的话,我想为整个操作添加一个超时,所以如果所有操作都没有在 15 秒内完成,则抛出。

非常感谢您的帮助:)

最佳答案

同样,我无法测试这段代码,但如果 Silverlight 没有 Parallel.ForEach,它应该可以工作,你可以使用 Task.WaitAll

    private IEnumerable<IProcessor> processors;

public void DoMultiOperations(Foo param, Action<IEnumerable<Bar>> callback)
{
var allResults = new ConcurrentQueue<Bar>();
Task.WaitAll(processors.Select(processor => Task.Factory.StartNew(() => GetData(processor, param, allResults))).ToArray());
callback(allResults);
}

private static void GetData(IProcessor processor, Foo param, ConcurrentQueue<Bar> allResults)
{
var enumerable = processor.Provide(param);
foreach (var bar in enumerable)
{
allResults.Enqueue(bar);
}
}

关于c# - 多个操作的并行化和结果的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11431860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com