Консультация № 191502
17.10.2017, 18:57
0.00 руб.
0 4 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

задание
Используя задачи (объекты классов Task и Task<TResult>), реализовать
программу согласно варианту задания (см. таблица 2). Спроектировать задачу
так, чтобы, несмотря на количество созданных в процессе выполнения задач,
завершение выполнения всего расчета можно было отследить по одной ,
объединяющей остальные, задаче.
вот сама задача http://c2n.me/3OEFECd

Код:

class Program
{
public static double Integral(double x)
{
//Console.WriteLine("X = {0}", x);
return Math.Sin(x) * Math.Cos(Math.Pow(x, 2));
}

public static int n;
public static double h;

public static double Compute(double a, double b)
{

var tasks = new List<Task<double>>();

h = (b - a) / n;

for (var i = a; i < b; i += h)
{
tasks.Add(Task.Factory.StartNew(() => Integral(i)));
}

Task.WhenAll(tasks.ToArray()).Wait();

return tasks.Select(t => t.Result).Sum() * h;
}

static void Main(string[] args)
{

Console.WriteLine("Введите количество интервалов: ");
n = int.Parse(Console.ReadLine());

Console.WriteLine(Compute(0, 5));

Console.ReadKey();
}
}


можете объяснить построчно что и как тут происходит пожалуйста?

Обсуждение

давно
Посетитель
399158
228
17.10.2017, 20:50
общий
а именно про метод Compute
давно
Советник
400484
472
19.10.2017, 17:31
общий
Код:

public static double Compute(double a, double b)
{
// Создаем список задач (Task - работает асинхронно)
var tasks = new List<Task<double>>();
// подсчитываем шаг изменения
h = (b - a) / n;
// тут создаем цикл от а до b с шагом h
for (var i = a; i < b; i += h)
{
// Добавляем в список новую задачу
tasks.Add(
// запускаем новую задачу
Task.Factory.StartNew(
// вычисляем интеграл ассинхроно
() => Integral(i)));
}
// Ожидаем завершения всех задач из списка
// Т.к. процессы асинхронные они могут завершаться в разное время. Не один за другим...
Task.WhenAll(tasks.ToArray()).Wait();
// конечный подсет
// выбирается для каждой задачи результат, затем суммируется и умножается на шаг
return tasks.Select(t => t.Result).Sum() * h;
}

Этого достаточно?
давно
Посетитель
399158
228
19.10.2017, 17:33
общий
уже разобрался, спасибо большое))
давно
Советник
400484
472
19.10.2017, 17:39
общий
это ответ
Здравствуйте, Посетитель - 399158!
Код:

public static double Compute(double a, double b)
{
// Создаем список задач (Task - работает асинхронно)
var tasks = new List<Task<double>>();
// подсчитываем шаг изменения
h = (b - a) / n;
// тут создаем цикл от а до b с шагом h
for (var i = a; i < b; i += h)
{
// Добавляем в список новую задачу
tasks.Add(
// запускаем новую задачу
Task.Factory.StartNew(
// вычисляем интеграл асинхронно
() => Integral(i)));
}
// Ожидаем завершения всех задач из списка
// Т.к. процессы асинхронные они могут завершаться в разное время. Не один за другим...
Task.WhenAll(tasks.ToArray()).Wait();
// конечный подсет
// выбирается для каждой задачи результат, затем суммируется и умножается на шаг
return tasks.Select(t => t.Result).Sum() * h;
}
5
Спасибо большое)))
Форма ответа