【问题标题】:UnoPlatform -The application called an interface that was marshalled for a different threadUnoPlatform - 应用程序调用了为不同线程编组的接口
【发布时间】:2020-05-30 13:09:04
【问题描述】:

我正在为我的 Uno 平台应用程序使用 Uno prism 模板。在 UWP 应用中进行异步调用后。即

var content = await GetHttpContentWithTokenAsync(graphAPIEndpoint,authResult.AccessToken).ConfigureAwait(false);

每当触发 RaisePropertyChanged() 方法时,我都会收到以下错误=>
{“应用程序调用了一个为不同线程编组的接口。(来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))”}

Git 仓库=> https://github.com/avikeid2007/Repayabl

文件=> https://github.com/avikeid2007/Repayabl/blob/dev/RepayablClient/RepayablClient.Shared/ViewModels/LoginViewModel.cs#L131

【问题讨论】:

  • 您是否尝试过从GetHttpContentWithTokenAsync 方法中删除ConfigureAwait(false); 的代码?我相信你的问题可能就在那里。

标签: prism uno-platform


【解决方案1】:

正如评论中提到的,这里的问题是.ConfigureAwait(false)的使用。

使用ConfigureAwait(false),您是在告诉编译器,“在这个等待的方法执行后,不要费心回到当前上下文,我很好。”在某些情况下,这可能是一种适当的优化,甚至可以防止死锁,尤其是在您编写类库时。

但是,您通常不应在 UI 线程的回调中使用它,例如这种情况。在 UWP 和实际上大多数 UI 框架中,您只能从主 UI 线程修改 UI,否则您将得到您提到的错误。因此,在等待的方法完成后,您需要返回到相同的上下文。

TLDR:删除ConfigureAwait(false),不要在从UI线程调用的async方法中使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 2011-04-05
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多