好吧,我想保持這個簡短和精確,我試圖找到最有效的方式來獲得大量的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函數成爲實際任務,並在該範圍內實現等待/異步功能變得多餘?那會浪費更多資源嗎?
無法回答沒有更多的上下文。 DoSomething()會做什麼 - 除了做你的HTTP請求嗎?請求完成後,您是否需要它做些什麼?如果你所要做的只是請求,那麼你應該使用異步請求API,從DoSomething()代表請求的'Task'返回,並且只需將_that_添加到列表中而不是使用Task.Run() '。如果'DoSomething()'在請求之後有更多的處理要做,你應該這樣做,但你可以'等待'它。無論哪種方式,都不太可能需要'Task.Run()'。但誰可以說,因爲你沒有共享代碼。 –
因此,返回任務的函數已經在訪問線程池上的線程,就好像我將一個非任務返回函數傳遞給Task.Run一樣?所以Task.Run(()=> DoSomething());會和創建一個返回任務的函數一樣嗎? –
_「一個返回任務的函數已經訪問線程池上的一個線程?」 - - 不一定,不。但它是異步操作的,這就是你在上面的代碼中所關心的。不要將「異步」與「併發」或「線程化」混淆。這兩者密切相關,但並不相同。有些異步機制不依賴於活動線程。 –