首页 > 解决方案 > BeginInvokeOnMainThread 未完成任务

问题描述

我们如何才能Device.BeginInvokeOnMainThread等到该过程完成?

没有得到 something它去Method(something);

Device.BeginInvokeOnMainThread(async () =>
                {
                    something = await SomeFunction();
                });
Method(something);

标签: c#xamarin

解决方案


首先,我建议您重新考虑您的设计。后台线程不应与 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);

推荐阅读