C# 一个任务失败,而所有任务也失败,并且没有进行任何修改。通过在循环内等待,一些配置将得到更新,而另一些配置则不会更新。这将一次执行一个报告。如果报表引擎一次只能处理一个报表,即使是异步的,那么这可能是正确的选项。OP确实说了我想用WhenAll(而不是一个接
C# 一个任务失败,而所有任务也失败,并且没有进行任何修改。通过在循环内等待,一些配置将得到更新,而另一些配置则不会更新。这将一次执行一个报告。如果报表引擎一次只能处理一个报表,即使是异步的,那么这可能是正确的选项。OP确实说了我想用WhenAll(而不是一个接,c#,async-await,C#,Async Await,一个任务失败,而所有任务也失败,并且没有进行任何修改。通过在循环内等待,一些配置将得到更新,而另一些配置则不会更新。这将一次执行一个报告。如果报表引擎一次只能处理一个报表,即使是异步的,那么这可能是正确的选项。OP确实说了我想用WhenAll(而不是一个接一个)@PanagiotisKanavos运行所有任务-使用并行执行报告的方法进行了更新每当我在选择中看到导致副作用的代码时,我都会感到奇怪。我不介意该函数是否被称为Iter函数,如F#sSeq.Iter@PanagiotisKanavos-同
一个任务失败,而所有任务也失败,并且没有进行任何修改。通过在循环内等待,一些配置将得到更新,而另一些配置则不会更新。这将一次执行一个报告。如果报表引擎一次只能处理一个报表,即使是异步的,那么这可能是正确的选项。OP确实说了
我想用WhenAll(而不是一个接一个)
@PanagiotisKanavos运行所有任务-使用并行执行报告的方法进行了更新每当我在选择
中看到导致副作用的代码时,我都会感到奇怪。我不介意该函数是否被称为Iter
函数,如F#sSeq.Iter
@PanagiotisKanavos-同意副作用。OP提供的配置的代码更新状态
-因此将符合其要求:)另一个考虑因素是错误将使配置取决于修改失败的配置。一旦你考虑了错误处理,事情就变得有趣多了。第一次出错时停止是否正常?跳过和记录失败?回滚所有内容?
var lastReportAllTasks = new List<Task<Dictionary<string, string>>>();
var configurationTaskRelation = new Dictionary<int, Task<Dictionary<string, string>>>();
foreach (var configuration in MachineConfigurations)
{
var task = machineService.GetReports(configuration);
lastReportAllTasks.Add(task);
configurationTaskRelation.Add(configuration.Id, task);
}
await Task.WhenAll(lastReportAllTasks);
foreach (var configuration in MachineConfigurations)
{
var lastReportTask = configurationTaskRelation[configuration.Id];
configuration.LastReport = await lastReportTask;
}
using System.Linq;
var taskResultsWithConfiguration = MachineConfigurations.Select(conf =>
new { Conf = conf, Task = machineService.GetReports(conf) }).ToList();
await Task.WhenAll(taskResultsWithConfiguration.Select(pair => pair.Task));
foreach (var pair in taskResultsWithConfiguration)
pair.Conf.LastReport = pair.Task.Result;
var tasks=MachineConfigurations.Select(async conf=>{
var report= await machineService.GetReports(conf);
return new {conf,report});
var results=await Task.WhenAll(tasks);
foreach(var pair in results)
{
pair.conf.LastReport=pair.report;
}
foreach(var task in tasks)
{
var pair=await task;
pair.conf.LastReport=pair.report;
}
foreach(var task in tasks)
{
try
{
var pair=await task;
pair.conf.LastReport=pair.report;
}
catch(Exception exc)
{
//Make sure the error is logged
Log.Error(exc);
ErrorQueue.Enqueue(new ProcessingError(conf,ex);
}
}
//Handle errors after the loop
var reportingBlock=new TransformBlock<Ticket,IFlowEnvelope<TicketReport>(reportFunc,dopOptions);
var happyBlock = new ActionBlock<IFlowEnvelope<TicketReport>>(storeToDb);
var errorBlock = new ActionBlock<IFlowEnvelope<TicketReport>>(logError);
reportingBlock.LinkTo(happyBlock,linkOptions,msg=>msg.Success);
reportingBlock.LinkTo(errorBlock,linkOptions,msg=>!msg.Success);
foreach(var ticket in tickets)
{
reportingBlock.Post(ticket);
}
async Task<IFlowEnvelope<Ticket,TicketReport>> reportFunc(Ticket ticket)
{
try
{
//Do the heavy processing
return new Success<TicketReport>(report);
}
catch(Exception exc)
{
//Construct an error message, msg
return new Failure<TicketReport>(report,msg);
}
}
foreach (var configuration in MachineConfigurations)
{
configuration.LastReport = await machineService.GetReports(configuration);
}
Func<Configuration, Task> loadReport =
async config => config.LastReport = await machineService.GetReports(config);
await Task.WhenAll(MachineConfigurations.Select(loadReport));
Func<Configuration, Task<Configuration>> getConfigWithReportAsync =
async config =>
{
var report = await machineService.GetReports(config);
return new Configuration
{
Id = config.Id,
LastReport = report
};
}
var configsWithUpdatedReports =
await Task.WhenAll(MachineConfigurations.Select(getConfigWithReportAsync));