【发布时间】:2020-04-20 07:27:18
【问题描述】:
所以我有一些代码需要在表单激活其 Shown 事件时执行,我需要等待该代码。我正在这样做:
form.Shown += async (sender, args) => await BufferOpen(CurrentPath, CurrentEncoding, 1024 * 1024 * 5, statusProgressForm.progressBar1);
statusProgressForm.Show();
但代码仍在继续,无需等待 BufferOpen 方法。如何使用匿名函数做到这一点?
编辑: 好的,所以我想我把原来的帖子搞砸了。对于那个很抱歉。我真正想做的是显示一个表单,然后在显示的事件上执行密集的代码,就像我之前那样:
form.Show();
DoIntensiveTasks();
表单上的 GUI 无法正确加载,标签等无法正确显示。我需要等到表格完全显示后再做一些事情。
【问题讨论】:
-
那里的代码连接了一个事件处理程序,然后显示
statusProgressForm。当事件处理程序被调用时,它会异步调用 BufferOpen 并立即返回。那么当您说“但代码仍在继续”时,您指的是哪个代码?为什么不呢?您希望在执行之前“等待”哪些代码? -
您已经注意到,事件对异步并不友好,但您的问题已经在这里得到解答:stackoverflow.com/questions/12451609/…
-
@ThadeuFernandes
async实际上是设计用于事件处理程序,因为它是 主要 用例。说它不适合用于事件是不正确的。 -
对不起,我的意思是在这个特定的上下文中,需要等待一个绑定到事件的委托/方法。事件不区分同步和异步委托,它们只是被调用,异步委托不回复调用者的上下文。
标签: c# winforms asynchronous async-await