簡體   English   中英

function中的Tasks如何實現? c#

[英]How to implement Tasks in function? c#

我必須使用 TPL 的 class 任務將矩陣乘以向量(這是實驗室工作,我必須這樣做)。 我使用 Parallel For 完成了它並且它可以工作但現在我被卡住了,因為我不知道如何使用任務來實現它。

public static int[] matxvecParallel(int [,] mat, int[] vec)ParallelFor
    {            
        int[] res = new int[mat.GetLength(0)];
        Parallel.For(0, mat.GetLength(0), i =>
        {
            for (int k = 0; k < mat.GetLength(1); k++)
            {
                res[i] += mat[i, k] * vec[k];
            }

        });
        return res;
    }

我做了一些愚蠢的事情來了解任務是如何工作的,但我仍然不明白。 如何更改我的代碼?

public static int[] matxvecTask(int[,] mat, int[] vec) 
    {
        int[] res = new int[mat.GetLength(0)];
        int countTasks = 4;
        Task[] arrayOfTasks = new Task[countTasks];

        for (int k = 0; k < mat.GetLength(0); k++)
        {
            for(int i = 0; i < countTasks; i++)
            {
            int index = i;
            arrayOfTasks[index] = Task.Run(() =>
                {
                    for (int j = 0; j < mat.GetLength(1); j++)
                    {
                        res[i] += mat[i, j] * vec[j];
                    }
                });
            }
        }
        return res;
    }

要使其工作,請將此行更改為使用index而不是i

res[index] += mat[index, j] * vec[j];

當你使用i時,你會陷入閉包的陷阱

然后,您還應該等待所有任務完成,然后再進行下一次迭代:

Task.WaitAll(arrayOfTasks);

現在,如果您將Parallel.For替換為任務,您將一無所獲。 你只會讓你的代碼更復雜。 任務和Parallel都將在線程池上執行您的計算。 但是, Parallel專門針對此目的進行了優化,並且更易於編寫和閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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