簡體   English   中英

任務清單C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM