如何在没有Task.Result的情况下通过await获取异步方法的确切结果?

h.o*_*a.n 4 c# async-await

我想尝试异步和等待,但我有一个惨败.我有方法需要异步运行两个方法(它部分工作)

public void Run()
{
            Task[] tasks = new Task[2];
            tasks[0] = Task.Factory.StartNew(DisplayInt);
            tasks[1] = Task.Factory.StartNew(DisplayString);

            //block thread until tasks end
            Task.WaitAll(tasks);
}
Run Code Online (Sandbox Code Playgroud)

并使用了两种方法

public async void DisplayInt()
    {
        Task<int> task = new Task<int>(
            () => 10);
        task.Start();
        Console.WriteLine(await task);
    }

    public async void DisplayString()
    {
        Task<string> task = new Task<string>(
           () => "ok" );
        task.Start();
        Console.WriteLine(await task);
   }
Run Code Online (Sandbox Code Playgroud)

通常我得到下一个结果:1)10 ok

或2)确定10

但有时我什么都没有

如何在不使用task.Result的情况下通过等待获得异步方法的确切结果,或者它不会发生?

Ste*_*ary 6

我建议你阅读一些像我自己的async介绍这样的介绍性文章,并在我的MSDN文章中关于异步最佳实践.如果你只是敲打代码,你最终会遇到很多痛苦.

特别是,你不应该使用Task.Factory.StartNew,Task构造,也没有Task.Start ; 你应该避免async void(所有链接都是我的博客,我详细解释了原因).

要回答您的实际问题:

如何在不使用task.Result的情况下通过等待获得异步方法的确切结果,或者它不会发生?

要从任务中获取结果,您可以异步等待任务完成(通过await),也可以同步(阻塞)等待任务完成(通过Result).没有"其他方式",如果这就是你所要求的.