你如何获得异步方法的返回值?

时间:2014-09-01 04:59:35

标签: .net async-await

您好我正在尝试理解任务和异步方法的概念。我一直玩这段代码已经有一段时间无济于事了。有人可以告诉我如何从test()方法获取返回值并将该值赋给变量?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
   class Program
   {

    static  void Main(string[] args)
    {

        Task test1 = Task.Factory.StartNew(() => test());
        System.Console.WriteLine(test1);
        Console.ReadLine();
    }

    public static async Task<int> test()
    {
        Task t = Task.Factory.StartNew(() => {   Console.WriteLine("do stuff"); });
        await t;
        return 10;
    }
}
}

1 个答案:

答案 0 :(得分:2)

要从Task中获取值,您可以await异步等待任务完成的任务,然后返回结果。另一种选择是调用阻塞当前线程的Task.Result,直到结果可用。这可能会导致GUI应用中出现deadlock,但在控制台应用中可以正常使用,因为他们没有SynchronizationContext

您无法在await方法中使用Main,因为它不能async,因此一个选项是使用test1.Result

static  void Main(string[] args)
{

    Task<int> test1 = Task.Factory.StartNew<int>(() => test());
    System.Console.WriteLine(test1.Result); // block and wait for the result
    Console.ReadLine();
}

另一个选项是创建一个async方法,您可以从Mainawait调用其中的任务。您仍然可能需要阻止等待async方法完成,以便您可以针对该方法的结果调用Wait()

static  void Main(string[] args)
{
    MainAsync().Wait(); // wait for method to complete
    Console.ReadLine();
}

static async Task MainAsync()
{
    Task<int> test1 = Task.Factory.StartNew<int>(() => test());
    System.Console.WriteLine(await test1); 
    Console.ReadLine();
}