【问题标题】:Is it possible/recommended to use Default (blank) Awaitable tasks?是否可以/推荐使用默认(空白)等待任务?
【发布时间】:2014-06-16 22:44:21
【问题描述】:

我有一些 VB.net 代码,如下所示:

If (condition1) Then
    Dim Task1 = function1Async()
    Dim Task2 = function2Async()
    Await Task.WhenAll(Task1, Task2)
Else
    Dim Task1 = function1Async()
    Dim Task3 = function3Async()
    Await Task.WhenAll(Task1, Task3)
End If

但我更喜欢这样做:

Dim Task1 = function1Async()
Dim Task2 = New Task()
Dim Task3 = New Task()
If (condition1) Then
    Task2 = function2Async()
Else
    Task3 = function3Async()
End If
Await Task.WhenAll(Task1, Task2, Task3)

但是,“New Task()”不会产生等待任务。 是否有某种 minimal awaitable 任务可以创建为占位符,以防以后没有创建 real 任务?

【问题讨论】:

  • 嗯,你可以有一个任务指向一个什么都不做的子,但你真正应该做的是建立一个列表真正的要执行的任务。
  • 我的真实代码更复杂,最后只有一个 Await 语句更易于维护。

标签: .net vb.net task async-await


【解决方案1】:

您不应该将Task 构造函数用于异步世界中的任务。

您可以通过调用Task.FromResult(0)来创建一个已完成的任务。

【讨论】:

  • 这应该是公认的答案,因为它会产生最少的开销,并且是 Stephen Toub 的recommended
  • 好吧,这确实回答了最初的问题,但 OP 绝对不需要空白任务来完成他正在尝试做的事情。
【解决方案2】:

既然你问了,你可以有一个“空白”任务指向一个虚拟的委托。但是,我认为使用有条件填充的任务列表会更好、更清晰:

Dim TaskList As New List(Of Task)

TaskList.Add(function1Async())

If (condition1) Then
    TaskList.Add(function2Async())
Else
    TaskList.Add(function3Async())
End If

Await Task.WhenAll(TaskList)

【讨论】:

    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多