调用彼此依赖的多个异步方法

Joh*_*hny 0 c# asynchronous async-await asp.net-core

我正在寻找调用多个异步方法的最佳实践,其中每个下一个方法都依赖于之前返回的值.

我正在尝试两种方法

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;
        });
    }
Run Code Online (Sandbox Code Playgroud)

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;
        });
    }
Run Code Online (Sandbox Code Playgroud)

只是试图理解最佳方法,因为我对异步编程有点新意.

提前致谢!

佐尼

Ste*_*ary 5

我正在寻找调用多个异步方法的最佳实践,其中每个下一个方法都依赖于之前返回的值.

通过查看同步等价物可以回答很多异步问题.如果所有方法都是同步的,并且每个方法都取决于以前方法的结果,那么它看起来如何?

var T1 = Sum(2,5);
var T2 = Sum(T1, 7);
var T3 = Sum(T2, 7);
Run Code Online (Sandbox Code Playgroud)

然后异步等价物将是:

var T1 = await SumAsync(2,5);
var T2 = await SumAsync(T1, 7);
var T3 = await SumAsync(T2, 7);
Run Code Online (Sandbox Code Playgroud)

PS为了将来参考,请不要插入StartNewTask.Run作为异步代码的通用占位符; 他们只是混淆了这个问题,因为他们有非常具体的用例.使用await Task.Delay代替; 它是Thread.Sleep异步世界的一部分.