Отдельный поток под BitmapImage - C#

Узнай цену своей работы

Формулировка задачи:

Есть метод:
        private Task<IEnumerable<PageModel>> LoadContent(string uri)
        {
            return Enumerable.Range(0, 1)
 
                .Select(url =>
                {
                    return GetHttp(uri);
                })
 
                .Select(async content =>
                {
                    var parser = new HtmlParser();
                    var document = parser.Parse(await content.ConfigureAwait(false));
 
                    return
                        document.QuerySelectorAll("div[role='main']")
                            .Select(element =>
                            element.InnerHtml.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
                            .TakeWhile(a => !a.Contains("<!--"))
                            .Select(con =>
                            {
                                var document2 = parser.Parse(con);
 
                                var result =
                                document2.All.Select
                                (n =>
                                {
                                    var html = n.InnerHtml;
                                    return
                                    html.Contains("img") && html.Contains("src")
                                    ? new PageModel
                                    {
                                        Img = new BitmapImage(new Uri(document2.QuerySelector("img")
                                            .GetAttribute("src"))),
                                    }
                                    : new PageModel
                                    {
                                        Content = document2.All
                                            .Select(nod => nod.TextContent)
                                            .First().Trim()
                                    };
                                })
                                .First();
 
                                return result;
                            }).Where(html => !string.IsNullOrWhiteSpace(html.Content)
                                             || html.Img != null)
                            ).First();
                }).First();
        }
Эта часть выдает ошибку:
new PageModel
    {
          Img = new BitmapImage(new Uri(document2.QuerySelector("img")
                .GetAttribute("src"))),
    }
System.AggregateException: One or more errors occurred. (Приложение обратилось к интерфейсу, относящемуся к другому потоку. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))) ---> System.Exception: Приложение обратилось к интерфейсу, относящемуся к другому потоку. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)) at Windows.UI.Xaml.Media.Imaging.BitmapImage..ctor(Uri uriSource) at NashNovoaltaisk01.MainPage.<>c__DisplayClass10_2.<LoadContent>b__5(IElement n) at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) at NashNovoaltaisk01.MainPage.<>c__DisplayClass10_1.<LoadContent>b__4(String con) at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext() at System.Collections.ObjectModel.ObservableCollection`1.CopyFrom(IEnumerable`1 collection) at NashNovoaltaisk01.MainPage.<>c.<GetContentAsync>b__7_1(IEnumerable`1 x) at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() at System.Collections.ObjectModel.ObservableCollection`1.CopyFrom(IEnumerable`1 collection) at NashNovoaltaisk01.MainPage.<GetContentAsync>d__7.MoveNext() --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) at System.Threading.Tasks.Task.Wait() at NashNovoaltaisk01.MainPage.OnNavigatedTo(NavigationEventArgs e) ---> (Inner Exception #0) System.Exception: Приложение обратилось к интерфейсу, относящемуся к другому потоку. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)) at Windows.UI.Xaml.Media.Imaging.BitmapImage..ctor(Uri uriSource) at NashNovoaltaisk01.MainPage.<>c__DisplayClass10_2.<LoadContent>b__5(IElement n) at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) at NashNovoaltaisk01.MainPage.<>c__DisplayClass10_1.<LoadContent>b__4(String con) at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext() at System.Collections.ObjectModel.ObservableCollection`1.CopyFrom(IEnumerable`1 collection) at NashNovoaltaisk01.MainPage.<>c.<GetContentAsync>b__7_1(IEnumerable`1 x) at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() at System.Collections.ObjectModel.ObservableCollection`1.CopyFrom(IEnumerable`1 collection) at NashNovoaltaisk01.MainPage.<GetContentAsync>d__7.MoveNext()<---
Закоментил участок, проблема не исчезла
System.AggregateException: One or more errors occurred. (Приложение обратилось к интерфейсу, относящемуся к другому потоку. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))) ---> System.Exception: Приложение обратилось к интерфейсу, относящемуся к другому потоку. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)) at Windows.UI.Xaml.Controls.ItemsControl.put_ItemsSource(Object value) at NashNovoaltaisk01.MainPage.<GetContentAsync>d__7.MoveNext() --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) at System.Threading.Tasks.Task.Wait() at NashNovoaltaisk01.MainPage.OnNavigatedTo(NavigationEventArgs e) ---> (Inner Exception #0) System.Exception: Приложение обратилось к интерфейсу, относящемуся к другому потоку. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)) at Windows.UI.Xaml.Controls.ItemsControl.put_ItemsSource(Object value) at NashNovoaltaisk01.MainPage.<GetContentAsync>d__7.MoveNext()<---
Решил часть проблем - перекинув код вызова методов в
protected override async void OnNavigatedTo(NavigationEventArgs e)
До этого вызывал в нем, но отдельный метод

private async Task GetContentAsync()

. Проблема с
new PageModel
    {
          Img = new BitmapImage(new Uri(document2.QuerySelector("img")
                .GetAttribute("src"))),
    }
Скорее всего придется загонять src картинок в "стринги" а затем новым потоком в BitmapImage. После завершения текущего.

Решение задачи: «Отдельный поток под BitmapImage»

textual
Листинг программы
    public class MainNewsData : INotifyPropertyChanged
    {
        private string imgSrcOld;
        private string imgSrcNew;
        public string ImgSrc
        {
            private get { return imgSrcNew; }
            set
            {
                imgSrcNew = value;
                Notify("ImgSrc");
            }
        }
 
        public string Content { get; set; }
        public string PageUri { get; set; }
 
        private BitmapImage image;
        public BitmapImage Image
        {
            get { return image; }
            private set
            {
                if (imgSrcNew!=imgSrcOld || imgSrcNew==null)
                {
                    image = new BitmapImage(new System.Uri(ImgSrc));
                    imgSrcOld = imgSrcNew;
                    Notify("Image");
                }
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
        private void Notify(string notify) =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(notify));
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы