2017-05-04 37 views
2

好吧,我想保持這個簡短和精確,我試圖找到最有效的方式來獲得大量的HttpWebRequests完成,但我有點困惑,如果我有一個任務列表並且我使用Task.WaitAll函數來等待,直到所有任務都完成爲止,讓列表中的Task(Action)也成爲一個異步任務是否矯枉過正?也許我可以更好地解釋自己在代碼:使用任務異步編程

 for (int i = 0; i < 50; i++) 
     { 
      taskList.Add(Task.Run(() => DoSomething())); 
     } 
     Task.WaitAll(taskList.ToArray()); 

好了,所以很簡單,我有一個for循環,將線程池內運行可用線程的DoSomething的方法,現在讓我們採取兩種不同的外觀在哪能實現這個DoSomething的()函數

public void DoSomething() 
{ 
Send off the HttpWebRequest here, with no awaits or any async programming 
} 

OR

public Task<ResponseData> DoSomething() 
{ 
Write the request here that awaits for responses, streams etc 
} 

如果我已經發送DoSomething的功能關閉的Task.Run功能犯規已經意味着它在線程池中運行它自己的線程?這意味着使DoSomething函數成爲實際任務,並在該範圍內實現等待/異步功能變得多餘?那會浪費更多資源嗎?

+0

無法回答沒有更多的上下文。 DoSomething()會做什麼 - 除了做你的HTTP請求嗎?請求完成後,您是否需要它做些什麼?如果你所要做的只是請求,那麼你應該使用異步請求API,從DoSomething()代表請求的'Task'返回,並且只需將_that_添加到列表中而不是使用Task.Run() '。如果'DoSomething()'在請求之後有更多的處理要做,你應該這樣做,但你可以'等待'它。無論哪種方式,都不太可能需要'Task.Run()'。但誰可以說,因爲你沒有共享代碼。 –

+0

因此,返回任務的函數已經在訪問線程池上的線程,就好像我將一個非任務返回函數傳遞給Task.Run一樣?所以Task.Run(()=> DoSomething());會和創建一個返回任務的函數一樣嗎? –

+0

_「一個返回任務的函數已經訪問線程池上的一個線程?」 - - 不一定,不。但它是異步操作的,這就是你在上面的代碼中所關心的。不要將「異步」與「併發」或「線程化」混淆。這兩者密切相關,但並不相同。有些異步機制不依賴於活動線程。 –

回答

2

如果我已經發送的DoSomething函數關閉到已經意味着它在它自己的線程中 線程池運行Task.Run 功能犯規? 這意味着使DoSomething功能成爲一個實際的 任務,並在該範圍內實現等待/異步功能 變得多餘

相反 - 當你使用另一個線程(Task.Run)爲「什麼都不做」的方法 - 等待響應時,你正在浪費資源。

await Task.Run(() => DoSomethingSynchronously)await DoSomethingAsynchronously()是不同的東西,因爲正確創建的async-await方法將在一個線程上執行。
在你的情況下,它會發送請求並將執行返回給調用者。響應到達後,它將在等待後繼續執行。

因此,使用Task.Run的方法什麼都不做 - 只是等待響應變成資源(線程)的浪費。

由於您的DoSomething方法可以與外部資源(webervices)協同工作,所以您根本無需擔心ThreadPool和線程。所有任務都可以在一個線程中使用async-await方法異步完成。

+0

我做了nt完全理解你想要在第三個parahraph上說什麼,但生病嘗試澄清。 有2個選項,要麼一對一地等待任務,要麼只是等待每個人。 等待1-by-1就是如果你真的想要減少資源使用量或與任務的先前結果有關。等待所有的手段,「在繼續前,完成所有事情直到這一點」。無論你使用什麼,你必須總是等待一個方法結束時的異步任務(除非將它移動到另一個方法中),否則你的賽車狀況會很糟糕。 –

+0

@OriRefael,我不是在談論多個任務,在第三段中,我試着「粗暴地」解釋異步方法可以在一個線程中執行。 – Fabio

+0

我想澄清當一個人有多個任務時使用異步等待的方法。 –