【发布时间】:2016-03-08 22:31:30
【问题描述】:
我正在尝试测试 .NET 的异步/等待功能。我在 LinqPad 中设置了一个小测试:
void Main(string[] args)
{
Test.DoStuff().Wait();
}
// Define other methods and classes here
public class Test
{
public async static Task DoStuff()
{
string s1 = "Hello 1";
string s2 = "Hello 2";
var s3 = await Test.Gimme();
string s4 = "Hello 4";
Console.WriteLine(s1);
Console.WriteLine(s2);
Console.WriteLine(s3);
Console.WriteLine(s4);
}
public async static Task<string> Gimme()
{
return await Task.Run<string>(() => RetString());
}
public static string RetString()
{
Console.WriteLine("Begin");
for (int i = 0; i < 90000000; i++)
{
string s = "FOO";
s = s + s;
s = s + s;
}
Console.WriteLine("End");
return "Task Hello 3!";
}
}
据我了解,我认为代码会一直执行到 s3 再次被使用 => Console.WriteLine(s3);
我错过了什么?!我认为 await 关键字可以做到这一点,只要不使用等待的结果,程序就会继续做它的事情。
也许我执行任务错了?!
【问题讨论】:
-
await将等待等待的对象完成,具体如何完成取决于上下文,但这意味着string s4 = ...在Test.Gimme完成之前不会执行。 -
如果您想实现想要的行为,请致电
Console.WriteLine(await s3);。这将在打印s1和s2之前开始执行 Gimme()。 -
如果你想模拟工作而不实际编写一个计算无用suff的循环,只需等待Task.Delay。
-
我对你的代码感到困惑。
return await Task.Run...超过return Task,Run,,,有什么意义?当你可以说“我的任务是做三明治”时,你会说“我的任务是等待完成制作三明治的任务”,这对我来说似乎很奇怪。 -
没有等待我得到一个同步方法(编译器警告)。
标签: c# .net async-await