2014-04-30 54 views
2

我有一些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) 

然而,「新建任務()」不會產生awaitable任務。 是否有某種最小awaitable的任務,我可以創造一個佔位符,如果不創建後來就真正任務?

+0

那麼你可以* *必須指向一個什麼都不做的子任務,但你真的* *應該做的是建立要執行的* *真正的任務列表。 – Crono

+0

我的真實代碼更加複雜,並且最終擁有單個Await語句的可維護性更高。 – Brent

+1

可能的複製http://stackoverflow.com/questions/13127177/if-my-interface-must-return-task-what-is-the-best-way-to-have-a-no-operation-imp –

回答

5

你不應該使用Task構造函數任務異步世界。

你可以通過調用Task.FromResult(0)創建完成的任務。

+2

這應該是公認的答案,因爲它會帶來開銷至少並[推薦](http://social.msdn.microsoft.com/Forums/en-US/fab0a26f-f5d6-4740-8bf0-4133fe1543bc/doing-nothing在異步方法)由斯蒂芬Toub。 –

+0

這個*確實*回答了原來的問題,但是OP絕對不需要空白任務來完成他想要做的事情。 – Crono

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) 
+0

那更有意義,謝謝! – Brent

相關問題