Как поместить асинхронный метод в список и вызывать их итеративно?

  1. Заполните массив с номерами от 1 до 100.
  2. Смешайте его .
  3. Возьмите первые 8 элементов результирующего массива.
1
задан Terence 16 January 2019 в 02:16
поделиться

2 ответа

Я думаю, вы просто ищете что-то простое?

var myList = new List<Action>()
{
    async() => { await Foo.GetBarAsync(); },
    ...
};

Я бы порекомендовал вам вместо этого изменить тип с Action на Func<Task>.

111 -async-lambdas /

Для вызова (упрощенно)

foreach (var action in myList)
{
    await action.Invoke();
}
0
ответ дан Svek 16 January 2019 в 02:16
поделиться

Во-первых, вам нужно сделать ваши методы асинхронными. Это означает, что они должны вернуть задание. Например:

public static async Task Foo()
{
    await Task.Delay(1);
    Console.WriteLine("Foo!");
}

public static async Task Bar()
{
    await Task.Delay(1);
    Console.WriteLine("Bar!");
}

Затем, чтобы поместить их в список, вы должны определить список как содержащий правильный тип. Поскольку асинхронный метод на самом деле что-то возвращает, это Func, а не действие. Возвращает задание.

var actions = new List<Func<Task>>
{
    Foo, Bar
};

Чтобы вызвать их, выберите список (используя Linq), чтобы вызвать их. Это создает список задач вместо списка функций.

var tasks = actions.Select( x => x() );

Тогда просто ждите их:

await Task.WhenAll(tasks);

Полный пример:

public static async Task MainAsync()
{
    var actions = new List<Func<Task>>
    {
        Foo, Bar
    };
    var tasks = actions.Select( x => x() );
    await Task.WhenAll(tasks);
}

Вывод:

Foo!
Bar!

Пример на DotNetFiddle [ 119]

Если ваши методы возвращают логическое значение, , тогда тип возвращаемого значения становится Task<bool>, а остальные следуют его примеру:

public static async Task<bool> Foo()
{
    await Task.Delay(1);
    Console.WriteLine("Foo!");
    return true;
}

public static async Task<bool> Bar()
{
    await Task.Delay(1);
    Console.WriteLine("Bar!");
    return true;
}

var actions = new List<Func<Task<bool>>>
{
    Foo, Bar
};

var tasks = actions.Select( x => x() );

await Task.WhenAll(tasks);

После того, как вы их ожидаете Вы можете преобразовать задачи в их результаты с помощью еще одного оператора LINQ:

List<bool> results = tasks.Select( task => task.Result ).ToList();
0
ответ дан John Wu 16 January 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: