- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,糟糕的标题,但我想不出一个更好的名字..我的问题甚至可能不是特定于异步/等待,但我的问题是在异步处理期间出现的,所以我要提出就这样:
我有几种创建任务列表然后执行“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/
我是一名优秀的程序员,十分优秀!