Как запустить много задач и получить их результат после того, как все они закончились? - PullRequest
0 голосов
/ 05 февраля 2020

Как я могу получить результат (bool) этих задач?

public static Random rnd = new Random();

static void Main()
{
    var tasks = new Task[10];

    for (int i = 0; i < 10; i++)
    {
        tasks[i] = new Task(async () => await T());
    }

    Task.WaitAll(tasks);

    for (int i = 0; i < tasks.Length; i++)
    {
        Console.WriteLine($"Task {i} result = {tasks[i].?????????}");
    }

    Console.ReadKey();
}

public static async Task<bool> T()
{
    await Task.Delay(500);
    return rnd.Next(2) == 1 ? true : false;
}

Ответы [ 2 ]

4 голосов
/ 05 февраля 2020

Вы можете также сделать Main() метод async и использовать WhenAll вместо WaitAll. И используйте только T() при назначении Task для элемента массива, нет необходимости делать это так new Task(async () => await T());

static async Task Main()
{
    var tasks = new Task<bool>[10];

    for (int i = 0; i < 10; i++)
    {
        tasks[i] = T();
    }

    await Task.WhenAll(tasks);

    for (int i = 0; i < tasks.Length; i++)
    {
        Console.WriteLine($"Task {i} result = {tasks[i].Result}");
    }

    Console.ReadKey();
}
0 голосов
/ 05 февраля 2020

Как отметил @GSerg, использование конструктора Task считается плохой практикой в ​​отрасли. Дело не в том, что в этом есть что-то не так, просто все становится сложнее, чем нужно, без веской причины. Если вам абсолютно необходимо использовать эту технику программирования, вот как вы могли бы это сделать:

var tasks = new Task<bool>[10];

for (int i = 0; i < 10; i++)
{
    var task = new Task<Task<bool>>(async () => await T());
    task.Start(); // Starts the outer task that creates the inner task
    tasks[i] = await task;
}

await Task.WhenAll(tasks);

for (int i = 0; i < tasks.Length; i++)
{
    Console.WriteLine($"Task {i} result = {await tasks[i]}");
}
...