Запустите функцию в фоновом режиме, оставив пользовательский интерфейс интерактивным C# Xamarin - PullRequest
0 голосов
/ 25 апреля 2020

Я хочу запустить эту функцию (и) в фоновом режиме

        private void SetPosters()
        {
            foreach(var i in posters)
            { 
                i.SetImageBitmap(GetImageBitmapFromUrl(getLinkfromTag((i.Tag).ToString())));
            }
        }
        private static string getLinkfromTag(String tag)
        {
            String Link = "-";
            foreach(var i in movies_Arr)
            {
                if(i.Id == tag)
                {
                    Link = i.HorizontalPoster;
                }
            }
            return Link;
        }
        private static Bitmap GetImageBitmapFromUrl(string url)
        {
            Bitmap imageBitmap = null;

            using (var webClient = new WebClient())
            {
                var imageBytes = webClient.DownloadData(url);
                if (imageBytes != null && imageBytes.Length > 0)
                {
                    imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
                }
            }

            return imageBitmap;
        }

Я не могу взаимодействовать с моим пользовательским интерфейсом, когда изображения загружаются из Интернета

Другая информация -

Posters - это просмотр списка, содержащий все просмотры изображений из действия movies_Arr - просмотр списка, содержащий ссылки на плакаты

1 Ответ

0 голосов
/ 25 апреля 2020

Вы можете запустить свой метод, используя метод «забей и забудь», выполнив команду CommandSetPosters или просто вызвав LaunchPosters(). Исполнение не будет ожидаемым, полностью асин c. Обратите внимание, что мы вызываем SetImageBitmap на шаге пользовательского интерфейса, в противном случае вы не сможете получить доступ к элементам пользовательского интерфейса должным образом.

 public ICommand CommandSetPosters
    {
        get
        {
            return new Command<object>((object context) =>
            {
                LaunchPosters(context);
            });
        }
    }

    public void LaunchPosters(object param)
    {
        Task.Run(async () =>
        {
            //can use param from command if needed
            SetPosters();

        }).ConfigureAwait(false);
    }

private void SetPosters()
{
    foreach (var i in posters)
    {
        var bitmap = GetImageBitmapFromUrl(getLinkfromTag((i.Tag).ToString()));


        Device.BeginInvokeOnMainThread(() =>
        {
            // Update the UI
            i.SetImageBitmap(bitmap);
        });

    }
}
...