gpt4 book ai didi

C# 如何让泛型方法等待?

转载 作者:行者123 更新时间:2023-11-30 12:12:36 28 4
gpt4 key购买 nike

好吧,糟糕的标题,但我想不出一个更好的名字..我的问题甚至可能不是特定于异步/等待,但我的问题是在异步处理期间出现的,所以我要提出就这样:

我有几种创建任务列表然后执行“await Task.WhenAll(任务列表)”的方法。这些方法中正在等待的特定类型的任务各不相同。例如,一些方法正在等待列表Task<String> 的列表,而其他人则在等待 Task<foo> 的列表。

我发现我需要在每个方法中围绕 Task.WhenAll() 执行一些重要的 try/catch 处理,并且该代码始终相同。我想将该代码移动到一个通用方法,然后传入任务列表并让该通用方法问题然后 WhenAll,在 try/finally 中结束。

但我遇到的问题是调用此方法的每个方法都将传递不同任务类型的列表,这会导致编译器在我将常用方法的参数声明为任务时提示:

methodA:
List<Task<String>> myTaskList = ...
ExecuteTasks(myTaskList);

methodB:
List<Task<Foo>> myTaskList = ...
ExecuteTasks(myTaskList);

async Task ExecuteTasks(List<Task> taskList) {
try {
await Task.WhenAll(taskList)
}
catch {
..common catch handling goes here. This handling isn't really sensitive to the
..type of the Tasks, we just need to examine it's Status and Exception properties..
}
}

上面methodA和methodB都有自己的任务列表需要传给ExecuteTasks,但是问题是如何定义任务列表给ExecuteTasks,编译器才不会报错类型不匹配?在非泛型世界中,我可能会将 ExecuteTasks 的参数定义为 methodA 和 methodB 列表类型的父类(super class),以便编译器可以“向上转换”它们,但这种方法在这里似乎不起作用。 (我尝试将 ExecuteTasks 定义为采用 Task<Object> 但这并没有解决类型不匹配问题)

最佳答案

尝试输入您的 ExecuteTasks针对 IEnumerable<Task>相反:

async Task ExecuteTasks(IEnumerable<Task> taskList) {

正如@Hamish Smith 所指出的,这是一个协方差问题。

List<Task<String>> myTaskList = ...

ExecuteTasks(myTaskList);

async Task ExecuteTasks(IEnumerable<Task> taskList) {
try {
await Task.WhenAll(taskList)
}
catch {
//..common catch handling goes here. This handling isn't really sensitive to the
//..type of the Tasks, we just need to examine it's Status and Exception properties..
}
}

如果它仍然是针对 List<Task> 键入的, 然后你可以做一些像这样的傻事:

List<Task<String>> myTaskList = ...

ExecuteTasks(myTaskList);

async Task ExecuteTasks(List<Task> taskList) {
taskList.Add(new Task<int>()) // bad stuff
}

关于C# 如何让泛型方法等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13368864/

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