【发布时间】:2019-05-06 04:26:40
【问题描述】:
我正在尝试将以下扩展方法 (source) 从 C# 转换为 VB:
public static Task ForEachAsync<T>(this IEnumerable<T> source,
int dop, Func<T, Task> body)
{
return Task.WhenAll(
from partition in Partitioner.Create(source).GetPartitions(dop)
select Task.Run(async delegate {
using (partition)
while (partition.MoveNext())
await body(partition.Current);
}));
}
delegate 的常规等效项是 Sub(),AFAIK,但我没想到它会在这种情况下工作,因为 Async 关键字(它没有)。所以,我尝试改用Function():
<System.Runtime.CompilerServices.Extension>
Public Function ForEachAsync(Of T)(source As IEnumerable(Of T),
dop As Integer, body As Func(Of T, Task)) As Task
Return Task.WhenAll(
From partition In Partitioner.Create(source).GetPartitions(dop)
Select Task.Run(Async Function() 'As Task '<-- see below.
Using partition
Do While partition.MoveNext()
Await body(partition.Current)
Loop
End Using
End Function))
End Function
但这仍然无法编译并显示以下错误:
-
WhenAll:Overload resolution failed because no accessible 'WhenAll' can be called with these arguments: 'Public Shared Overloads Function WhenAll(Of TResult)(tasks As IEnumerable(Of Task(Of TResult))) As Task(Of TResult())': Type parameter 'TResult' cannot be inferred. 'Public Shared Overloads Function WhenAll(Of TResult)(ParamArray tasks As Task(Of TResult)()) As Task(Of TResult())': Type parameter 'TResult' cannot be inferred. -
Await body(partition.Current):'Await' 只能在第一个查询表达式中使用 初始 'From' 子句的集合表达式或在 'Join' 子句的集合表达式。
-
[警告]
Async Function():(如果我添加As Task,它就会消失)函数 '
<anonymous method>' 不会在所有代码上返回值 路径。空引用异常可能在运行时发生,当 使用结果。
我做错了什么?在 VB 中执行此操作的正确方法是什么?
【问题讨论】:
-
您可能可以使用
Task.WhenAll(Partitioner.Create(source).GetPartitions(dop).Select(Function(p) (Task.Run(Async Function() Using p ... all the rest ... End Using End Function)而不是From partition In Partitioner.Create(source).GetPartitions(dop) Select Task.Run(Async Function() ... all the rest ...)来做到这一点(未经测试) -
当然其余的只是
While p.MoveNext() Await body(p.Current) End While:) -
@Jimi 这很奇怪!我不知道为什么我没有想到这一点。但更奇怪的是,即使两个版本都应该做同样的事情(对吗?),它仍然有效。我错过了什么?无论如何,请将此作为答案发布:)
-
你可能会喜欢这个(因为作者:)Async/Await FAQ。请参阅 我在哪里不能使用“等待”? 部分,最后一点。
-
@Jimi 这基本上与上面第二个错误所说的相同。我不明白的部分是它与 C# 代码有什么不同?另一方面,如果您想发布答案,我会接受,因为您确实帮助我解决了问题。
标签: c# vb.net lambda async-await c#-to-vb.net