您好我正在尝试理解任务和异步方法的概念。我一直玩这段代码已经有一段时间无济于事了。有人可以告诉我如何从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 :(得分: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
方法,您可以从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();
}