为什么 continueWith 使用 action(of task) 作为参数?
Why does continueWith uses action(of task) as a parameter?
基本上,它要求一个以 Task 作为参数的 sub。这就是 Action(of Task) 对吗?
为什么?
我知道我可以将普通的 sub 传递给 continueWith。我从来不记得传递了一个需要任务参数的子程序。
根据定义。 'ContinueWith' 在大多数情况下应该使用 'antecedent' 任务的结果。如果你忘记了如何调用'ContinueWith',Visual Studio'Peek Definition'会帮助你。因此,右键单击 'ContinueWith' 并选择 'Peek Definition',您将检查签名。基本上,它看起来像下面的代码片段所示。
public Task<TNewResult> ContinueWith<TNewResult>(
Func<Task<TResult>, TNewResult> continuationFunction)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
return this.ContinueWith<TNewResult>(continuationFunction, TaskScheduler.Current, new CancellationToken(), TaskContinuationOptions.None, ref stackMark);
}
如果太复杂,您可以使用片段并保存示例,然后在需要时插入。
那么,让我们创建一个示例。
Module Module1
Sub Main()
Dim taskA As Task(Of DayOfWeek) = Task.Run(Function() DateTime.Today.DayOfWeek )
' Execute the continuation when the antecedent finishes.
Dim taskB As Task(Of string) = taskA.ContinueWith(Function (antecedent)
Return $"Today is {antecedent.Result}"
End Function)
taskb.Wait()
Console.WriteLine(taskB.Result)
Console.ReadLine()
End Sub
End Module
基本上,它要求一个以 Task 作为参数的 sub。这就是 Action(of Task) 对吗?
为什么?
我知道我可以将普通的 sub 传递给 continueWith。我从来不记得传递了一个需要任务参数的子程序。
根据定义。 'ContinueWith' 在大多数情况下应该使用 'antecedent' 任务的结果。如果你忘记了如何调用'ContinueWith',Visual Studio'Peek Definition'会帮助你。因此,右键单击 'ContinueWith' 并选择 'Peek Definition',您将检查签名。基本上,它看起来像下面的代码片段所示。
public Task<TNewResult> ContinueWith<TNewResult>(
Func<Task<TResult>, TNewResult> continuationFunction)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
return this.ContinueWith<TNewResult>(continuationFunction, TaskScheduler.Current, new CancellationToken(), TaskContinuationOptions.None, ref stackMark);
}
如果太复杂,您可以使用片段并保存示例,然后在需要时插入。
那么,让我们创建一个示例。
Module Module1
Sub Main()
Dim taskA As Task(Of DayOfWeek) = Task.Run(Function() DateTime.Today.DayOfWeek )
' Execute the continuation when the antecedent finishes.
Dim taskB As Task(Of string) = taskA.ContinueWith(Function (antecedent)
Return $"Today is {antecedent.Result}"
End Function)
taskb.Wait()
Console.WriteLine(taskB.Result)
Console.ReadLine()
End Sub
End Module