【发布时间】:2020-10-13 23:44:10
【问题描述】:
我有一个 .NET Core 2.1 项目,它有一个 BackgroundService,我希望它负责处理记录一组不同任务的结果,这些任务可以返回不同的值。我想将他们的所有输出分组到一个任务管理器类中以记录他们的输出。是否可以有一个 List<Task> 包含来自这些异步方法的所有 Task 对象?
我不想为每个我想要await 的方法设置多个Task 字段。我宁愿将它们放入某种List 中,因为我希望该管理器管理的异步方法可能不止这三种。
我正在考虑做类似的事情:
public class MyTaskManager : BackgroundService
{
private readonly ILogger<MyTaskManager> _logger;
private APIInvoker _invoker;
public MyTaskManager (ILogger<MyTaskManager> logger, APIInvoker invoker)
{
_logger = logger;
_invoker= invoker;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
List<Task<object>> tasks = new List<Task<object>>();
tasks.Add(_invoker.GetImportWarningsAsync("1"));
tasks.Add(_invoker.GetImportErrorsAsync("2"));
tasks.Add(_invoker.GetImportStatusAsync("3"));
}
其中GetImportWarningsAsync、GetImportErrorsAsync、GetImportStatusAsync定义为:
internal async Task<string> GetImportWarningsAsync(...)
internal async Task<string> GetImportErrorsAsync(...)
internal async Task<ImportResponse> GetImportLeadStatusAsync(...)
如果它们返回不同的类型,我是否可以做 tasks.Add(...) 并我将它们添加到 List<Task<object>> 时很模糊。我不认为这是可能的。我怎样才能实现这样的目标?
最终,我想在 tasks 中的每个 Task 执行时运行一个方法。
例如。
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
List<Task<object>> tasks = new List<Task<object>>();
tasks.Add(_invoker.GetImportWarningsAsync("1"));
tasks.Add(_invoker.GetImportErrorsAsync("2"));
tasks.Add(_invoker.GetImportStatusAsync("3"));
Task<object> finishedTask = await Task.WhenAny(tasks);
tasks.Remove(finishedTask);
HandleTask(finishedTask, await finishedTask);
}
private void HandleTask(Task task, object value)
{
if (value is ImportResponse)
{
_logger.LogInformation((value as ImportResponse).someProp); // Log something
}
else
{
// Any other object type will be logged here - In this case string.
_logger.LogInformation(value.ToString());
}
}
【问题讨论】:
-
value需要做什么? -
请edit 发帖澄清您到底想要实现什么 -
_logger.LogInformation(/$"Log task value {value}")显然是一种解决方案,但我怀疑您是否对此感兴趣。还要确保澄清为什么它不是 stackoverflow.com/questions/17197699/… 的重复项
标签: c# .net-core async-await type-conversion task-parallel-library