如何在功能中实现任务? c#

问题描述 投票:0回答:1

我必须使用TPL中的Task类将矩阵乘以矢量,(这是实验室的工作,我必须这样做)。我使用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;
    }
c# multithreading parallel-processing task task-parallel-library
1个回答
0
投票

要使其正常工作,请将此行更改为使用index而不是i

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

使用i时,您会掉入trap of closures

然后,您还应该等待所有任务完成,然后再进行下一个迭代:

Task.WaitAll(arrayOfTasks);

现在,如果将Parallel.For替换为任务,您将一无所获。您只会使代码更复杂。任务和Parallel都将在线程池上执行您的计算。但是,Parallel专门针对此目的进行了优化,并且更易于读写。

© www.soinside.com 2019 - 2024. All rights reserved.