Tak.Run ContinueWith无法正常更新android上的UI

问题描述 投票:0回答:1

[嗨,我有一个带有cocossharp项目的xamarin,我尝试使用Task.Run,​​但UI更新仅在iOS上有效。

这是我的代码。

 await Task.Run(async () => {
                            await UserService.InitLoadOtherPlayerResoucres();

                        }).ContinueWith(a => {
                            PlayerTwoFinal = UserService.OtherPlayersProfile;
                            PlayerTwoFinal.ContentSize = new CCSize(PlayerTwo.ContentSize.Width, PlayerTwo.ContentSize.Height);
                            PlayerTwoFinal.Position = new CCPoint(PlayerTwo.PositionX, PlayerTwo.PositionY);
                            Player2.AddChild(PlayerTwoFinal, 0);
                            Debug.WriteLine(">>>>> LOAD ORIGINAL IMAGE COMPLETE");
                        });

我尝试了Task.Factory.StartNew,但是没有运气。

这是UserService.InitLoadOtherPlayerResoucres()的代码:

First PartSecond Part

c# android xamarin task
1个回答
0
投票

[ContinueWith()不一定要在UI线程上执行代码。

[您可以使用overload来强制ContinueWith()使用UI线程,但实际上您应该完全异步:

var a = await UserService.InitLoadOtherPlayerResoucres();

PlayerTwoFinal = UserService.OtherPlayersProfile;
PlayerTwoFinal.ContentSize = new CCSize(PlayerTwo.ContentSize.Width, PlayerTwo.ContentSize.Height);
PlayerTwoFinal.Position = new CCPoint(PlayerTwo.PositionX, PlayerTwo.PositionY);
Player2.AddChild(PlayerTwoFinal, 0);
Debug.WriteLine(">>>>> LOAD ORIGINAL IMAGE COMPLETE");

通过使用await,您可以确保在执行UserService.InitLoadOtherPlayerResoucres()时UI线程将保持可用。

使用Task.Run也是多余的,只会引入开销。


根据修订后的问题进行更新

尽管InitLoadOtherPlayerResoucres已经用async关键字修饰,但实际上根本不是异步的,因此无论是否等待它都将阻塞。

理想情况下,您应该重写InitLoadOtherPlayerResoucres以实现真正的异步,这将确保完成异步工作时将释放UI线程。

当您呼叫GetByteArrayAsync().Result时; .Result将阻塞线程,直到由Task生成的GetByteArrayAsync()完成为止。相反,它应该是:

var streamImage = await webClient.GetByteArrayAsync(OtherPlayersUserPhoto);
© www.soinside.com 2019 - 2024. All rights reserved.