BeginInvokeOnMainThread没有完成任务

时间:2019-02-01 10:37:49

标签: c# xamarin

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

如果没有得到something,它将转到Method(something);

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

1 个答案:

答案 0 :(得分:0)

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