Как реализовать Задачи в функции? c# - PullRequest
0 голосов
/ 22 апреля 2020

Я должен умножить матрицу на вектор, используя класс Task из TPL (это лабораторная работа, и я должен). Я сделал это с помощью 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;
    }

1 Ответ

0 голосов
/ 23 апреля 2020

Чтобы это сработало, измените эту строку на index вместо i:

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

Когда вы используете i, вы попадаете в ловушку замыканий .

Затем вам следует дождаться завершения всех задач, прежде чем переходить к следующей итерации:

Task.WaitAll(arrayOfTasks);

Теперь вы абсолютно ничего не получите, если замените Parallel.For с задачами. Вы только усложняете свой код. Обе задачи и Parallel выполнят ваши вычисления в пуле потоков. Тем не менее, Parallel оптимизирован специально для этой цели, и его легче писать и читать.

...