Tak.Run ContinueWith не работает обновление пользовательского интерфейса на android - PullRequest
0 голосов
/ 30 апреля 2020

Привет, у меня есть этот xamarin с проектом cocossharp, и я попытался использовать Task.Run, но обновление интерфейса работает только на 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 Part Second Part

1 Ответ

2 голосов
/ 30 апреля 2020

ContinueWith() не обязательно будет выполнять код в потоке пользовательского интерфейса.

Существует перегрузка , которую можно использовать, чтобы заставить ContinueWith() использовать поток пользовательского интерфейса, но на самом деле вы должны работать полностью асин c:

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() выполняется.

Использование Task.Run также является излишним и вводит только накладные расходы.


Обновление в соответствии с измененным вопросом

Хотя InitLoadOtherPlayerResoucres был отмечен async ключевое слово, на самом деле он вообще не асинхронный и, следовательно, будет блокироваться, независимо от того, ожидается ли это.

В идеале вы должны переписать InitLoadOtherPlayerResoucres, чтобы он был действительно асинхронным, что обеспечило бы поток пользовательского интерфейса будет освобожден после выполнения асинхронной работы.

при вызове GetByteArrayAsync().Result; .Result будет блокировать поток до тех пор, пока Task, сгенерированный GetByteArrayAsync(), не завершится. Вместо этого это должно быть:

var streamImage = await webClient.GetByteArrayAsync(OtherPlayersUserPhoto);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...