如何获得异步方法的返回值?
你好,我想了解任务和异步方法的概念。我一直在玩这段代码有一段时间没有用。有人能告诉我如何从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;
}
}
}
来获取值了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();
}
对于运行'test()'的任务,将'Task.Factory.StartNew'更改为'Task.Factory.StartNew
错误是因为'Task'没有'Result'属性,而是'Task
当处理'async-await'时,使用'Task.Run'而不是'Task.Factory.StartNew'。 – 2014-09-01 10:40:25
看看我的[curah](http://curah.microsoft.com/45553/asyncawait-general“async-await General”)上的文章。 – 2014-09-01 10:43:02