我熟悉使用 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/