Vb.net 如何调试等待语句?

Vb.net 如何调试等待语句?,vb.net,async-await,Vb.net,Async Await,我最近看到了一些关于TPL和异步模式的演示,所以我开始了一个小pet项目来尝试一些东西。(异步和并行) 我注意到SqlConnection有一个OpenAsync()方法,所以我想尝试一下。据我所知,await关键字告诉编译器检查操作是否完成,如果没有完成,它将把代码的其余部分转换为继续任务。我也明白我应该仍然能够调试代码。然而,我在这方面有一些问题 我编写了以下简单的测试代码: Async Sub Gogo() Try Await connection1.OpenAsy

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

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

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

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配置为升级未观察到的异常:

<runtime>
    <ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>      

然而,到目前为止,我没有得到任何例外。 我错过了什么?请帮忙:)

两者都无法访问,控制台应用程序将直接退出

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

调用
wait
时,异步操作会尝试捕获调用方的同步上下文,然后继续该上下文。在控制台应用程序中,没有同步上下文(因为没有消息泵等),因此在线程池线程上调度创建的延续

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

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


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

好的,谢谢。我没有意识到我的主要日程已经结束了,但情况显然是这样。不知道我怎么会错过:)我重写了一点,并使用了线程。睡眠使主线程保持活力,并看到事情发生。这似乎比你建议的要容易一点?否则,将GUI应用程序用作更符合逻辑的上下文可能是正确的,但正如前面提到的,我想同时尝试几件事:)谢谢!