[嗨,我有一个带有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()的代码:
[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);