gpt4 book ai didi

c# - 管理具有不同输出的任务

转载 作者:行者123 更新时间:2023-12-02 02:36:06 25 4
gpt4 key购买 nike

我有一个 .NET Core 2.1 项目,其中有 BackgroundService我希望它的责任只是处理记录一组可以返回不同值的不同任务的结果。我想将它们的所有输出分组到任务管理器类中以记录它们的输出。可以吗List<Task>它将包含所有 Task来自这些异步方法的对象?

我不想有多个Task我想要的每个方法的字段 await在。我宁愿将它们放入 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>> 。我认为这是不可能的。我怎样才能实现这样的目标?

最终,我想为每个 Task 运行一个方法在tasks当其中任何一个执行时。

例如。

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());
}
}

最佳答案

任务不是这样协变的,但没有什么可以阻止您根据需要自行转换结果:

    var tasks = new List<Task<object>>();

tasks.Add(((Func<Task<object>>)(async () => (object)await _invoker.GetImportWarningsAsync("1")))());
tasks.Add(((Func<Task<object>>)(async () => (object)await _invoker.GetImportErrorsAsync("2")))());
tasks.Add(((Func<Task<object>>)(async () => (object)await _invoker.GetImportStatusAsync("3")))());

关于c# - 管理具有不同输出的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64283219/

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