c# - BeginInvokeOnMainThread 未完成任务
问题描述
我们如何才能Device.BeginInvokeOnMainThread
等到该过程完成?
没有得到 something
它去Method(something)
;
Device.BeginInvokeOnMainThread(async () =>
{
something = await SomeFunction();
});
Method(something);
解决方案
首先,我建议您重新考虑您的设计。后台线程不应与 UI 线程联系或在其上安排工作。考虑反转此控件并使 UI 线程成为老板。您可以使用IProgress<T>
/Progress<T>
进行进度更新,或者如果您遇到后台线程未请求更新的罕见情况,您可以使用SynchronizationContext
.
不过,如果你真的想用BeginInvokeOnMainThread
,那也是可以的。有两个问题:BeginInvokeOnMainThread
接受一个Action
参数(因此您必须小心async
委托)和BeginInvokeOnMainThread
返回void
,因此从该方法获取结果值很困难。
也就是说,您可以使用它TaskCompletionSource<T>
来强制它工作:
var tcs = new TaskCompletionSource<SomeFunctionReturnType>();
Device.BeginInvokeOnMainThread(async () =>
{
try { tcs.TrySetResult(await SomeFunction()); }
catch (Exception ex) { tcs.TrySetException(ex); }
});
Method(await tcs.Task);
推荐阅读
- r - 错误:没有方法 asJSON S3 类:直方图
- webpack - webpack 找不到入口点
- c# - 如何使用“C# 和 MVVM 模式”一书的演示项目
- firebase - 如果我使用 firestore 在一次更新中更新多个字段,那么会计算多少次读取操作?
- .net - 调用 asp.net 核心项目的启动配置文件时,launchBrowser 不起作用
- python - setattr 接受无效的标识符
- ruby - 如何做geojson与rgeo的交集?
- php - htaccess 多次重写问题
- javascript - 当我重新加载页面并且没有检查 Laravel 6.0 中的单选按钮之一时,如何一次只显示一个表单
- android - 如果数据是通过意图从另一个活动获取的,如何使用文本观察器添加多个文本视图