Вызовите несколько асинхронных методов, которые зависят друг от друга - PullRequest
0 голосов
/ 21 февраля 2019

Я ищу лучший способ вызова нескольких асинхронных методов, где каждый следующий метод зависит от значений, возвращенных ранее.

Я экспериментирую с двумя подходами

1) https://dotnetfiddle.net/waPL9L

public async void Main()
    {       
        var T1 = await Sum(2,5);
        var T2 = await Sum(T1, 7);
        var T3 = await Sum(T2, 7);      

        Console.WriteLine(T3);
    }

    public async Task<int> Sum(int num1, int num2){
        return await Task.Run(() => {
            // for some reason if i use Sleep... I don't see any results at all...
            //Thread.Sleep(2000);
            return num1 + num2;
        });
    }

2) https://dotnetfiddle.net/1xycWH

public async void Main()
    {
        var T1 = Sum(2,5);
        var T2 = Sum(T1.Result, 7);
        var T3 = Sum(T2.Result, 7);

        //var myVar = T3.Result;

        var listOfTasks = new List<Task>{T1,T2,T3};

        await Task.WhenAll(listOfTasks);

        Console.Write(T3.Result);
    }

    public async Task<int> Sum(int num1, int num2){
        return await Task.Run(() => {
            Thread.Sleep(1000);
            return num1 + num2;
        });
    }

Просто пытаюсь понять лучший подход, как будто я новичокв асинхронное программирование.

Заранее спасибо!

Джонни

1 Ответ

0 голосов
/ 21 февраля 2019

Я ищу лучший способ вызова нескольких асинхронных методов, где каждый следующий метод зависит от значений, возвращенных от одного ранее.

На многие асинхронные вопросы можно ответить, посмотревв синхронном эквиваленте.Если все методы синхронны и каждый метод зависит от результатов предыдущих методов, как это будет выглядеть?

var T1 = Sum(2,5);
var T2 = Sum(T1, 7);
var T3 = Sum(T2, 7);

Тогда асинхронный эквивалент будет:

var T1 = await SumAsync(2,5);
var T2 = await SumAsync(T1, 7);
var T3 = await SumAsync(T2, 7);

PS Для дальнейшего использования не вставляйте StartNew или Task.Run в качестве общих заполнителей для асинхронного кода;они просто путают проблему, поскольку у них очень специфические варианты использования.Вместо этого используйте await Task.Delay;это Thread.Sleep асинхронного мира.

...