【问题标题】:Can't call async method synchronously from MeasureOverride无法从 MeasureOverride 同步调用异步方法
【发布时间】:2015-12-28 13:28:07
【问题描述】:

我需要从 MeasureOverride 调用异步方法。这个调用应该是同步的,因为我需要返回异步方法的值。

我尝试了来自这些线程的十几个不同的调用: Synchronously waiting for an async operation, and why does Wait() freeze the program here How would I run an async Task<T> method synchronously?

它们都失败了,有些无法在通用 Windows 应用程序中编译,有些不同步,有些引发了死锁等。

我强烈反对 async/await,因为它会污染调用层次结构原型。在覆盖级别,我没有使用 async 关键字,我需要从黑盒同步调用 await 。具体应该怎么做呢?

【问题讨论】:

    标签: c# asynchronous async-await uwp


    【解决方案1】:

    你应该做的第一件事就是后退一步。首先应该没有需要MeasureOverride 中调用异步代码。

    异步代码通常意味着 I/O 绑定操作。需要向远程 Web 服务器发送请求、查询数据库或读取文件的 XAML UI 元素只是为了知道它的 size 是什么,这是错误的。这是应用认证被拒的捷径。

    几乎可以肯定,最好的解决方案是将异步代码移出元素本身。仅在必要的异步工作完成后创建/修改 UI 元素。

    也就是说,如果您觉得在异步操作完成时必须阻止 UI 线程,我已经编制了一份我所知道的所有 hack 的列表,发布在 my MSDN article on brownfield asynchronous development

    【讨论】:

    • 所以基本上你对我的应用程序是如何设置的以及它在做什么做出了一堆错误的假设。那么您建议我重新构建在 WPF 中完美运行的数千行代码吗?一旦我找出正确的语法,而不是制作一个具有所有技术原因能够工作的快速补丁?
    • 不确定您的回复是否曾经做过 WPF 编程,但这是基本工作流程,WPF 调用 MeasureOverride,我需要不时报告大小。大小来自await方法,no deal不可协商,就是黑匣子。
    • 您的建议基本上是重新创建 WPF GUI 框架。 WPF 不是您创建元素,因此您无法控制 GUI 框架中的 await-async。
    • @user1169933 - 你似乎认为社区让你失望了。不知道为什么。 StackOverflow 上的问题由志愿者回答。没有 SLA,您无权获得立即响应。另外,您在圣诞节期间发布了您的问题。所以,请冷静一下。侮辱试图帮助你的人是没有办法的。
    • @user1169933: The size comes from an await method, no deal not negotiable, that's the black box. 那么我建议你先调用异步方法,然后创建已知大小的 UI 元素。
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多