2014-09-01 91 views
3

你好,我想了解任务和异步方法的概念。我一直在玩这段代码有一段时间没有用。有人能告诉我如何从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; 
    } 
} 
} 
+0

看看我的[curah](http://curah.microsoft.com/45553/asyncawait-general“async-await General”)上的文章。 – 2014-09-01 10:43:02

回答

2

来获取值了Task可以await其异步等待完成任务的任务,然后返回结果。另一个选项是呼叫Task.Result,它阻止当前线程,直到结果可用。这会导致GUI应用程序中的deadlock,但在控制台应用程序中可以使用,因为它们没有SynchronizationContext

你不能在Main方法使用await,因为它不能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方法,你从Main调用和await里面的任务。您仍可能需要阻止等待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(); 
} 
+0

对于运行'test()'的任务,将'Task.Factory.StartNew'更改为'Task.Factory.StartNew '。我更新了解决方案。 – 2014-09-01 06:05:13

+0

错误是因为'Task'没有'Result'属性,而是'Task '。 – 2014-09-01 06:05:42

+3

当处理'async-await'时,使用'Task.Run'而不是'Task.Factory.StartNew'。 – 2014-09-01 10:40:25