好吧,标题不好,但我想不出更好的名字。我的问题可能甚至不是特定于异步/等待的,但我的问题是在异步处理期间出现的,所以我打算这样提出:
我有几种方法可以创建任务列表,然后执行“await Task.WhenAll(任务列表)”。在这些方法中等待的具体任务类型各不相同。例如,一些方法正在等待列表Task<String>
,而其他人正在等待Task<foo>
.
我发现我需要在这些方法中的每一个中围绕 Task.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 列表类型的超类,以便编译器可以“向上转换”它们,但这种方法似乎在这里不起作用.. (我尝试将 ExecuteTasks 定义为采用 aTask<Object>
但这并没有解决类型不匹配的问题)