【问题标题】:Windows forms, reflection and awaitWindows 窗体、反射和等待
【发布时间】:2019-06-17 18:44:53
【问题描述】:

我有一个 Winforms 应用程序 (.Net Core 3.0),它需要使用为 .Net Core 2.1 创建的二进制程序集

二进制程序集通过反射加载。

一些对象从加载的程序集中实例化(也通过反射),WinForms 应用程序本地的一些依赖对象在实例化时传递到这些构造函数中。

当在 Winforms 应用程序中使用这些依赖对象时,一切都会按预期工作。有可以成功等待的异步方法。

但是,当“反射创建”对象调用了一个使用传入依赖对象的方法时,事情会按预期工作,直到调用 await 为止。

await 的结果成功(例如,调用 Cosmos Db,我可以在其中看到数据发生变化),但线程永远不会从 await 调用返回。然后表单主线程启动并继续前进。如果进行了几次调用,则主线程(和表单)将冻结。

这些依赖对象不与任何 Windows 窗体控件交互。

如果有人对为什么线程返回调用方法而不是等待有任何想法,我将永远感激不尽。

【问题讨论】:

  • 请提供MCVE 来说明您的问题。
  • 您是在调用堆栈上方的任何位置调用WaitResult 吗?
  • @StephenCleary - 不,很遗憾不是。被调用的方法是通过反射调用的,因为它传递的方法参数是基类型,而方法本身需要一个子类。
  • @JSteward - 这是一个相当复杂的设置,因此很难做到这一点。如果我有时间尝试,我会 - 我同意这会有所帮助。没有人喜欢没有代码的问题...

标签: c# .net winforms async-await


【解决方案1】:

这是导致问题的代码行(不幸的是,我迷失在整个项目的复杂性中)

kvp.Value.ForEach(async handler => await ((dynamic)handler).Handle(@event, cancellationToken));

我现在已将要等待的任务添加到 List<Task> 并等待 WhenAll

按照我上面的方式进行操作意味着封闭方法没有被标记为异步,而是表达式。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多