在使用一次性对象时,我在尝试并行处理多个任务(或者运行时感觉合适)时遇到了问题。在下面的代码片段中,每个处理器对象在完成所需的工作之前立即被释放。
async public Task ProcessData(IEnumerable<int> data)
{
var tasks = new List<Task>();
foreach (var d in data)
{
using (var processor = new Processor(d))
{
processor.Completed += (sender, e) => { // Do something else };
tasks.Add(processor.ProcessAsync());
}
}
await Task.WhenAll(tasks);
}
如下重写代码会导致每个处理器执行其处理然后被处置,但这不是运行多个不相互依赖的任务的最有效方式。
async public Task ProcessData(IEnumerable<int> data)
{
foreach (var d in data)
{
using (var processor = new Processor(d))
{
processor.Completed += (sender, e) => { // Do something else };
await processor.ProcessAsync();
}
}
}
有人可以解释为什么第一个示例是“早期”处理,并举例说明这种情况下的最佳代码模式。