【发布时间】:2015-01-22 02:15:32
【问题描述】:
我一直在反复阅读 Stephen Cleary 的文章 StartNew is Dangerous 和 Stephen Toub 的文章 Task.Run vs Task.Factory.StartNew。我正在尝试理解这一点。
给定以下代码:
Dim s = Await Task.Factory.StartNew(New Func(Of Task(Of String))(
Async Function()
Await Task.Delay(10000)
Return "Hello"
End Function))
Dim t = Await Task.Run(New Func(Of Task(Of String))(
Async Function()
Await Task.Delay(10000)
Return "Hello"
End Function))
为什么s 是Task(Of String) 类型,而t 是String 类型(这是我所期望的)?
我还可以执行以下操作:
Dim u = Await New Func(Of Task(Of String))(
Async Function()
Await Task.Delay(10000)
Return "Hello"
End Function).Invoke()
其中u 是String,我可以添加函数:
Async Function GetValueAsync() As Task(Of String)
Await Task.Delay(10000)
Return "Hello"
End Function
然后像这样使用它:
Dim v = Await GetValueAsync()
而v 也是String。
那么为什么s 不是字符串呢?
在 Stephen Cleary 的文章(如上链接)中,他说:
[Task.Factory.StartNew] 不理解异步委托...问题 是当您将异步委托传递给 StartNew 时,很自然 假设返回的任务代表该委托。然而,由于 StartNew 不了解异步委托,该任务实际上是什么 代表只是该委托的开始。
我觉得这是整个事情的关键,但我不明白“那个任务实际上代表的只是那个委托的开始。” “那个委托的开始”是什么意思?
【问题讨论】:
标签: vb.net delegates async-await