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

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

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

Есть метод:
Листинг программы
  1. private Task<IEnumerable<PageModel>> LoadContent(string uri)
  2. {
  3. return Enumerable.Range(0, 1)
  4. .Select(url =>
  5. {
  6. return GetHttp(uri);
  7. })
  8. .Select(async content =>
  9. {
  10. var parser = new HtmlParser();
  11. var document = parser.Parse(await content.ConfigureAwait(false));
  12. return
  13. document.QuerySelectorAll("div[role='main']")
  14. .Select(element =>
  15. element.InnerHtml.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
  16. .TakeWhile(a => !a.Contains("<!--"))
  17. .Select(con =>
  18. {
  19. var document2 = parser.Parse(con);
  20. var result =
  21. document2.All.Select
  22. (n =>
  23. {
  24. var html = n.InnerHtml;
  25. return
  26. html.Contains("img") && html.Contains("src")
  27. ? new PageModel
  28. {
  29. Img = new BitmapImage(new Uri(document2.QuerySelector("img")
  30. .GetAttribute("src"))),
  31. }
  32. : new PageModel
  33. {
  34. Content = document2.All
  35. .Select(nod => nod.TextContent)
  36. .First().Trim()
  37. };
  38. })
  39. .First();
  40. return result;
  41. }).Where(html => !string.IsNullOrWhiteSpace(html.Content)
  42. || html.Img != null)
  43. ).First();
  44. }).First();
  45. }
Эта часть выдает ошибку:
Листинг программы
  1. new PageModel
  2. {
  3. Img = new BitmapImage(new Uri(document2.QuerySelector("img")
  4. .GetAttribute("src"))),
  5. }
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()<---
Решил часть проблем - перекинув код вызова методов в
Листинг программы
  1. protected override async void OnNavigatedTo(NavigationEventArgs e)
До этого вызывал в нем, но отдельный метод

private async Task GetContentAsync()

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

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

textual
Листинг программы
  1.     public class MainNewsData : INotifyPropertyChanged
  2.     {
  3.         private string imgSrcOld;
  4.         private string imgSrcNew;
  5.         public string ImgSrc
  6.         {
  7.             private get { return imgSrcNew; }
  8.             set
  9.             {
  10.                 imgSrcNew = value;
  11.                 Notify("ImgSrc");
  12.             }
  13.         }
  14.  
  15.         public string Content { get; set; }
  16.         public string PageUri { get; set; }
  17.  
  18.         private BitmapImage image;
  19.         public BitmapImage Image
  20.         {
  21.             get { return image; }
  22.             private set
  23.             {
  24.                 if (imgSrcNew!=imgSrcOld || imgSrcNew==null)
  25.                 {
  26.                     image = new BitmapImage(new System.Uri(ImgSrc));
  27.                     imgSrcOld = imgSrcNew;
  28.                     Notify("Image");
  29.                 }
  30.             }
  31.         }
  32.  
  33.         public event PropertyChangedEventHandler PropertyChanged;
  34.         private void Notify(string notify) =>
  35.             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(notify));
  36.     }

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


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

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

13   голосов , оценка 3.846 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы