首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调试await语句?

如何调试await语句?
EN

Stack Overflow用户
提问于 2013-03-20 00:00:00
回答 1查看 345关注 0票数 4

我最近看了一些关于TPL和异步模式的演示,所以我开始了一个小项目来尝试一些东西。(异步和并行的东西)

我注意到SqlConnection有一个OpenAsync()方法,所以我想尝试一下等待它。据我所知,await关键字告诉编译器检查操作是否完成,如果没有完成,它会将其余代码转换为继续任务。我也明白,我应该仍然能够调试代码。然而,我在这方面有一些问题。

我写了以下简单的测试代码:

代码语言:javascript
复制
Async Sub Gogo()
    Try
        Await connection1.OpenAsync()
    Catch ex As Exception
        Console.WriteLine(ex)
    End Try
    SomeCode()
End Sub

当我运行这段代码(控制台应用程序)时会发生什么?我确实得到了await语句,但没有进一步。我尝试在catch语句和try块下面的代码中设置断点。两者都没有达到,并且控制台应用程序干脆退出。我不明白这里发生了什么。

我使用的是VS2012更新1 (VB).Net 4.5。此外,因为我怀疑发生了一些错误(这似乎没有什么意义,因为代码在我使其同步时才能正常工作),我将app.config配置为升级未观察到的异常:

代码语言:javascript
复制
<runtime>
    <ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>      

然而,到目前为止,我还没有得到任何异常。我遗漏了什么?请帮助:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-20 00:04:12

两者都未达到,并且控制台应用程序干脆退出。

问题是您在控制台应用程序中使用它。如果您在Windows窗体或WPF应用程序中执行相同的操作,您将看到非常不同的行为。

当您调用Await时,异步操作会尝试捕获调用方的同步上下文,然后继续执行该上下文。在控制台应用程序中,没有同步上下文(因为没有消息泵等),所以创建的延续被安排在一个ThreadPool线程上。

异步操作开始,然后继续进行-控制台应用程序结束,因为它到达了Main()例程的末尾,之后您再也看不到这些东西了。

如果你想看到这些事情发生,你需要在你的控制台应用程序中添加一些东西来阻止它的完成。例如,您可以使用ManualResetEvent并在SomeCode()之后设置它,然后在您的Main()例程中调用WaitOne()。这将使应用程序保持活动状态,直到异步操作完成。

也就是说,如果您试图理解Async/Await,我建议您在图形用户界面应用程序中“播放”,而不是在控制台应用程序中。在Windows窗体和WPF中自动安装正确的同步上下文时,查看和理解所发生的事情要简单得多。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15504410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档