【问题标题】:Awaiting code inside of anonymous function [closed]等待匿名函数内的代码[关闭]
【发布时间】: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


【解决方案1】:

问题在于,因为您使用了表达式 lambda,所以它仅将一个表达式作为该匿名方法的一部分执行,因此 Show 调用不是该匿名方法的一部分。只需使用方括号使其成为语句 lambda:

form.Shown += async (sender, args) =>
{
    await BufferOpen(CurrentPath, CurrentEncoding, 1024 * 1024 * 5, statusProgressForm.progressBar1);
    statusProgressForm.Show();
};

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 2019-03-24
    • 1970-01-01
    • 2021-04-11
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多