//Метод, осуществляющий запуск параллельного алгоритма сортировки слиянием. //Результат - время подготовки необходимого для запуска асинхронных //вычислений и разбиения задачи на подзадачи. public long workAsync() { Stopwatch watcher = new Stopwatch(); // вычисление полного времени вычислений watcher.Start(); InputData[] ClArr = new InputData[processCount]; // Создал хранилище начальных данных для подзадач for (int i = 0; i < processCount; i++) ClArr[i] = new InputData(); int step = (Int32)(itemCount / processCount); // Размер данных int c = -1; for (int i = 0; i < processCount; i++) // Заполнил хранилище исходными данными { ClArr[i].start = c + 1; ClArr[i].stop = c + step; c += step; } // Создадим диспетчер задач Dispatcher d = new Dispatcher(processCount, "Test Pool"); DispatcherQueue dq = new DispatcherQueue("Test Queue", d); // Определим экземпляр порта Port<int> port = new Port<int>(); // Заполняем диспетчер задачами for (int i = 0; i < processCount; i++) { Arbiter.Activate(dq, new Task<InputData, Port<int>>(ClArr[i], port, sort)); } // Зададим задачу, которая будет выполнена после выполнения всех остальных задач Arbiter.Activate(dq, Arbiter.MultipleItemReceive(true, port, processCount, delegate (int[] array) { // Проведем окончательно слияние 2 отсортированных подмасива MainMerge(raw, 0, (itemCount - 1) / 2 + 1, itemCount - 1); watcher.Stop(); // Выведем сообщение об времени выполнения алгоритма Console.WriteLine("Общее время выполнения: " + watcher.ElapsedMilliseconds); } )); return watcher.ElapsedMilliseconds; }
public void sort(InputData data, Port<int> resp) { Stopwatch sWatch = new Stopwatch(); sWatch.Start(); // Запустим на выполнение линейный алгоритм SortMerge(raw, data.start, data.stop); sWatch.Stop(); // Выведем информацию о том, сколько по времени работал конкретно этот поток Console.WriteLine("Поток № {0}: локальное время работы = {1} мс.", Thread.CurrentThread.ManagedThreadId, sWatch.ElapsedMilliseconds.ToString()); resp.Post(1); }