在另一个 AppDomain 中调用 Await 时没有 SynchronizationContext

2024-04-15

我已经成功构建了一个插件机制,可以在单独的 AppDomain 中创建 UI 控件,并将它们显示为主 AppDomain 中表单的一部分。

这些 UI 控件会加载自己的数据,因此当我打开表单时,会创建大约 10 个不同的插件,每个插件都需要加载其数据。

同样,如果我同步执行,这一切都可以正常工作,但我想在每个插件中使用异步/等待模式。我的刷新方法如下所示:

protected async void RefreshData()
{ 
    _data = await LoadAsync(_taskId);  <= UI Thread     :)
    OnDataChanged();                   <= Worker Thread :( 
}

现在问题就开始了。当我进入此方法时,我位于主 UI 线程上。但是,当等待结束时,我处于工作线程上,因此我在OnDataChanged()更新控件的方法。

await默认情况下应该使用SynchronizationContext.Current为了它的延续,但由于我在另一个应用程序域中,这恰好是 NULL。

所以我的问题是。如何配置await 以在当前线程(即UI 线程)上继续?

我知道我可以获取一个控件并执行 Invoke() 但我也使用 MVVM 模式,这是在视图模型中,所以我无权访问那里的任何控件,并且所有视图模型 -> 视图通信都是通过数据完成的绑定。


我终于弄清楚如何从单独的 AppDomain 中返回 UI 线程,而无需控件的句柄。

由于我的视图模型始终在 UI 线程上实例化,因此我只需获取当前的调度程序:

_dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher

现在,在我的 RefreshData 方法中,我所要做的就是在等待之后调度我想要执行的操作。

protected async void RefreshData()
{ 
    _data = await LoadAsync(_taskId);            <= UI Thread :)
    _dispatcher.Invoke(() => OnDataChanged());   <= UI Thread :)
}

当然,可以通过封装调度程序等使其变得更奇特。

这个想法实际上来自于:MVVM 轻型工具包 http://mvvmlight.codeplex.com/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在另一个 AppDomain 中调用 Await 时没有 SynchronizationContext 的相关文章

随机推荐

  • IE8 CSS 旋转

    我正在寻找在 IE8 中旋转元素的 CSS 解决方案 我发现的一些解决方案说它应该在 IE8 中工作 但它不适合我 我做错了什么 这是我尝试过的
  • Android Studio - 包含和使用 .so 库

    我需要在我的 android 项目中使用一些本机库 so 根据 StackOverflow 中有关此主题的一些答案 我创建了一个jniLibs文件夹中app src main并将我的文件放在那里 armeabi my lib so arme
  • Python 嵌套循环

    count 1 for i in range 10 for j in range 0 i print count end count count 1 print input 我正在编写一个程序 其输出应如下所示 1 22 333 4444
  • Git:如何克隆第一次提交?

    谁能告诉我如何克隆第一次提交 我不想删除最近的提交 只需制作初始状态的克隆副本 以便我可以获取一些文件 如果 首次提交 是指本身没有任何父级的分支的父级提交 那么您需要使用 git rev list 来执行此操作 只需使用 git rev
  • python 如何使用 setattr 或 exec 创建私有类变量?

    我刚刚遇到了一种情况pseudo 使用时私有类成员名称不会被破坏setattr or exec In 1 class T def init self kwargs self x 1 for k v in kwargs items setat
  • 使用SQL Server从命名相同的XML节点中获取所有数据

    我有一个 XML 文件 其中我需要数据的节点的名称都相同 我了解如何访问第一条 或第二条记录 因此以下查询仅给出第二作者
  • C# - LINQ - GPS 纬度和经度的最短距离

    我有数据库 其中有带有 GPS 坐标的一流酒店 我想获得距离我选择的坐标最近的地方 我认为它应该看起来像这样 我在这里找到了很多示例代码 就像这样 var coord new GeoCoordinate latitude longitude
  • 如何将大精灵 png 切成较小的 UIImages?

    例如 png文件是1200 h x 50 w 像素 我怎样才能cutpng 并加载为 6UIImages 每个 200 高 x 50 宽 谢谢 编辑 感谢 Michal 的回答 最终代码 CGImageRef imageToSplit UI
  • 如何在 pytest 中仅运行未标记的测试

    我的 python 测试代码中有几个标记 pytest mark slowtest pytest mark webtest pytest mark stagingtest 我可以使用标记有选择地运行测试 例如pytest m slowtes
  • AEM 6.1 Maven 依赖关系解析

    我使用 AEM6 1 和 Maven 作为构建管理器 我想延长com day cq dam core process ThumbnailProcess班级 使用 ARM 内置依赖解析器 系统 控制台 depfinder 看来该类应该包含在
  • 如何创建符合 Swift 和 Objective-C 之间共享协议的类方法?

    我最近一直在学习 Swift 我决定编写一个混合 Swift Objective C 应用程序 使用两种语言实现的相同算法来执行计算密集型任务 该程序计算大量素数 我定义了一个 Swift 和 Objective C 版本的计算对象都应该遵
  • 使用 Windows 身份验证从网络共享批量插入 SQL Server 需要哪些权限?

    我正在开发一个将数据批量加载到 SQL Server 2008 数据库中的应用程序 它将 CSV 文件写入网络共享 然后调用包含 BULK INSERT 命令的存储过程 我正在将应用程序迁移到一个全新的网络 在这个新世界中 批量插入失败并出
  • Rust 柴油 orm 查询

    我是生锈和柴油奥姆的新手 我正在尝试在我的查询中执行以下操作 count select order limit 但我收到错误 我正在使用 postgres 数据库 我已在评论中的查询上方添加了确切的错误 这是我的代码 模式 rs table
  • 如何使用 React 过渡组为每个项目使用不同的延迟?

    我正在使用动画来制作一系列项目的进入和退出TransitionGroup and CSSTransition 具有淡入淡出效果 我希望这些项目之间有轻微的延迟 而不是同时出现 请注意 延迟可以低于动画的持续时间 使用我当前的代码 所有项目都
  • 为什么 grails run-app 在编译期间尝试访问远程服务器

    我发现我的 grails 应用程序编译过程中出现了一些错误 Loading Grails 2 0 4 Configuring classpath problems summary ERRORS Server access Error Une
  • 使用 Visual Studio 2012 构建面向 Windows XP 的 Boost 1.52 库

    Visual Studio 2012 Update 1 使用工具集 vc110 xp 启用了对 Windows XP 目标的支持 如何配置 Boost 1 52 以使用 vc110 xp 工具集构建库 我发现最简单的方法是编辑 Progra
  • 处理 android 中 RestClient 调用的连接和读取超时

    我有一个 RestService 接口 其中包含许多休息调用 我在整个应用程序中使用这些调用 我正在设置处理超时connection and read timeouts ClientHttpRequestFactory httpFactor
  • Powershell在导入txt文件时跳过前2行

    我有一个 powershell 脚本 旨在读取远程服务器上的 txt 文件并将其导入 SQL 中 我希望能够跳过 txt 文件的前两行 我目前正在使用下面的代码来导入文件 txt 文件已分隔 datatable new object Sys
  • 不使用 Obfuscator 的 DLL 加密

    事实上 我被分配了一项任务来保护我的 DLL 这样 如果我将我的软件部署到任何系统 就没有人可以修改或读取我的 DLL 你能帮我如何在不使用混淆器的情况下对其进行加密吗 您将需要软件来执行此操作 以下是您可能需要考虑的一些软件 Eazfus
  • 在另一个 AppDomain 中调用 Await 时没有 SynchronizationContext

    我已经成功构建了一个插件机制 可以在单独的 AppDomain 中创建 UI 控件 并将它们显示为主 AppDomain 中表单的一部分 这些 UI 控件会加载自己的数据 因此当我打开表单时 会创建大约 10 个不同的插件 每个插件都需要加