c# - Xamarin.Forms - 用于异步操作的 BeginInvokeOnMainThread

标签 c# xamarin async-await xamarin.forms

我熟悉使用 Device.BeginInvokeOnMainThread 在 UI 线程上更新 UI 元素的规则,但是我有一个操作需要在 UI 线程上运行,它实际上是一个任务。

例如,XLabs.Forms.Mvvm 上的 Push/PopAsync 方法在 iOS 上似乎表现不正确,除非在 UI 线程上调用它们。 Acr.UserDialogs 库中还有另一个示例,用于显示 toast 等。

我知道使 Action 异步基本上就是创建一个 async void lambda,并且在出现异常的情况下会冒着创建死锁的风险,显然我不希望这种情况发生。

有没有人有在不涉及将 Action 标记为异步的情况下在 UI 线程上执行异步操作的解决方法?

最佳答案

Xamarin.Forms 4.2 开始,现在有一个辅助方法可以在主线程上运行任务并等待它们。

await Device.InvokeOnMainThreadAsync(SomeAsyncMethod);

存在几个应该涵盖大多数场景的重载:

System.Threading.Tasks.Task InvokeOnMainThreadAsync (System.Action action);
System.Threading.Tasks.Task InvokeOnMainThreadAsync (System.Func<System.Threading.Tasks.Task> funcTask);
System.Threading.Tasks.Task<T> InvokeOnMainThreadAsync<T> (System.Func<System.Threading.Tasks.Task<T>> funcTask);
System.Threading.Tasks.Task<T> InvokeOnMainThreadAsync<T> (System.Func<T> func);

相关公关:https://github.com/xamarin/Xamarin.Forms/pull/5028

注意:PR 有一些错误已在 v4.2 中修复,因此不要在 v4.1 中使用它。

关于c# - Xamarin.Forms - 用于异步操作的 BeginInvokeOnMainThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39673153/

相关文章:

c# - 注册表中 UnistallString 的用途是什么

c# - MySql.Data c# .net 库我应该使用哪个运行时?

c# - 使用 VisualStateManager 启动和停止 Storyboard

user-interface - 您可以在 Xamarin Android/iOS 中创建 UI 并在 Xamarin.Forms 中创建代码吗?

android - UnsatisfiedLinkError : No implementation found for void mono. android.text.TextWatcherImplementor

c# - MonoTouch BackgroundWorker 调用 TextView 不工作

c# - 如何在 Spinner 中选择项目并将其用作字符串?

c# - NUnit 异步测试 + RequiresSTA => 等待不在 STA 线程上返回

C# 异步/等待未观察到的异常

node.js - 在Electron应用程序中使用node-firebird进行除SELECT之外的其他操作时出错