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);