我们如何让Device.BeginInvokeOnMainThread
等到该过程完成?
如果没有得到something
,它将转到Method(something)
;
Device.BeginInvokeOnMainThread(async () =>
{
something = await SomeFunction();
});
Method(something);
答案 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);