【发布时间】:2015-06-16 08:10:46
【问题描述】:
我只是在学习任务和 async/await 实现,我正在为一个简单的代码示例而苦苦挣扎,所以我希望有人可以分享一些关于正在发生的事情的信息。
代码如下:
public async Task<string> DoStuff()
{
Console.WriteLine("Long running op started");
var myString = await Task<string>.Run(() =>
{
var result = "Test";
for (int counter = 0; counter < 5000; counter++)
{
Console.WriteLine(counter);
}
return (result);
});
Console.WriteLine(myString);
return myString;
}
private void button1_Click(object sender, EventArgs e)
{
DoStuff();
while (true) {
Console.WriteLine("Doing Stuff on the Main Thread...................");
System.Threading.Thread.Sleep(100);
}
所以执行的结果是这样的: 长时间运行的操作已开始 0 1 2 …… 225 226 在主线程上做事............ 227 …… 等等……
但是,永远无法到达位于 Task.Run 之后的 DoStuff 方法中的代码。我不明白为什么。当然,如果我在 DoStuff 调用之前放置一个等待它可以工作,但是主线程被卡住等待执行。 这一切仅用于学习目的。 谢谢
编辑:正如下面的 cmets 所说,当代码是主入口程序并且它最初是在按钮单击事件中时,它有效地工作,这实际上是问题发生的地方,对于混淆感到抱歉。
【问题讨论】:
-
我刚刚运行了您的示例并打印了“测试”。你确定这是你正在运行的代码吗?
-
我运行了它,它运行良好; “测试”已打印 - 您确定您只是没有在所有其他控制台输出中闪烁并错过它吗?
-
确认,确实返回了“Test”
-
另外,
Of course if I put an await in front of the DoStuff call it works but then the main thread is stuck waiting for execution.具有误导性 -Main将简单地返回,并且应用程序将在到达await时立即结束。听起来您实际上并没有运行控制台应用程序,这与您发布的代码示例所暗示的不同... -
@Luaan 他实际上不能在 Main 中使用
await。我认为他很困惑。
标签: c# asynchronous async-await