[英]List of Tasks C#
var tasks = new List<Task>();
for (int i = 0; i < pageCount; i++)
{
var task = Task.Run(() =>
{
worker.GetHouses(currentPage);
});
tasks.Add(task);
currentPage++;
}
Task.WaitAll(tasks.ToArray());
我有些不明白。
每當我使用:
var tasks = new[]
{
Task.Run(() => {worker.GetHouses(1);}),
Task.Run(() => {worker.GetHouses(2);}),
Task.Run(() => {worker.GetHouses(3);})
};
我循環通過該數組,我得到的結果很好。 (當使用Task.WaitAll(tasks)
當我使用時:
var tasks = new List<Task>();
我的Task.WaitAll(tasks.toArray())
似乎不起作用,我的任務“狀態”停留在“ RanToCompletion”上
我做錯了什么?
您有currentPage
變量的同步問題。 同時創建帶有結果的任務。
解:
var tasks = new List<Task<List<House>>>();
for (int i = 0; i < pageCount; i++)
{
var currentPageCopy = currentPage;
var task = Task.Run(() =>
{
return worker.GetHouses(currentPageCopy);
});
tasks.Add(task);
currentPage++;
}
Task.WaitAll(tasks.ToArray());
您的代碼的問題在於,將使用currentPage + pageCount - 1
GetHouses
調用所有GetHouses
調用currentPage + pageCount - 1
因為最后一個值將用於所有方法調用...
任務類型幾乎沒有問題。
在您的示例中,您使用的是System.Threading.Tasks.Task
,它沒有結果-它僅用於完成某些工作,例如void
方法。
在您的代碼中:
var tasks = new[]
{
Task.Run(() => {worker.GetHouses(1);}),
Task.Run(() => {worker.GetHouses(2);}),
Task.Run(() => {worker.GetHouses(3);})
};
沒有顯式指定任何類型,因此結果是System.Threading.Tasks.Task<List<House>>
,但是您首先指定了System.Threading.Tasks.Task
第一段代碼:
var tasks = new List<Task>();
您需要使用System.Threading.Tasks.Task<TResult>
:
var tasks = new List<Task<List<House>>>();// <- task type specified explicitly
for (int i = 0; i < pageCount; i++)
{
var task = Task.Factory.StartNew<List<House>>(() =>// <- task type specified explicitly , though it's mandatory here
{
return worker.GetHouses(currentPage);
});
tasks.Add(task);
currentPage++;
}
在類似的情況下,我傾向於顯式地定義類型,以使代碼更清晰易讀,如您所見,甚至可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.