using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Imaging;
namespace IMDBWpf
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
///
public partial class MainWindow : Window
{
private List<Movie> movieList;
BackgroundWorker bgWorker;
private string searchText;
public MainWindow()
{
InitializeComponent();
bgWorker = new BackgroundWorker();
bgWorker.DoWork += bgWorker_doWork;
bgWorker.RunWorkerCompleted += bgWorker_Completed;
}
private void bgWorker_Completed(object sender, RunWorkerCompletedEventArgs e)
{
Dispatcher.Invoke(() =>
{
movieList = new Movies(searchText).movieList;
searchBar.ItemsSource = movieList;
});
}
private void bgWorker_doWork(object sender, DoWorkEventArgs e)
{
Dispatcher.Invoke(() =>
{
var loadingMovie = new Movie("src\\loader.gif", "Loading...");
movieList = new List<Movie>();
movieList.Add(loadingMovie);
searchBar.ItemsSource = movieList;
searchBar.IsDropDownOpen = true;
});
}
private void searchBar_DataContextChanged(object sender, RoutedEventArgs e)
{
searchText = searchBar.Text;
if(!bgWorker.IsBusy)
bgWorker.RunWorkerAsync();
}
}
}
У меня есть comboBox. Каждый элемент из combobox имеет метку и изображение.UserInterface зависает, когда работает BackgroundWorker
ComboBox заполнен элементами веб-страницы, процесс занимает некоторое время, пока это не будет выполнено.
Основная проблема заключается в том, что когда я пишу что-то в comboBox (да, это редактируется), мое приложение зависает, пока не будет создан список с элементами. Чтобы избавиться от этого замораживания, я попытался использовать BackgroundWorker, но он не работает ... Любые идеи почему? Я попытался использовать потоки в классе, который генерирует список, но ничего не происходит.
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace IMDBWpf
{
struct Movie
{
public Movie(string movieImg, string movieT)
{
movieTitle = movieT;
movieImage = movieImg;
}
public string movieTitle { get; set; }
public string movieImage { get; set; }
}
class Movies
{
public List<Movie> movieList { get; set; }
public Movies(string movieName)
{
if (movieName.Length > 0)
{
populateList(movieName);
}
}
private void populateList(string movieName)
{
var webSite = new HtmlAgilityPack.HtmlWeb();
var siteAddress = "http://www.imdb.com/find?ref_=nv_sr_fn&q=" + movieName + "&s=tt";
HtmlDocument htmlPage = webSite.Load(siteAddress);
movieList = new List<Movie>();
int index = 0;
while (htmlPage.DocumentNode.Descendants("td").ElementAt(index).Descendants("a").Any())
{
var movie = new Movie();
movie.movieImage = htmlPage.DocumentNode.Descendants("td").ElementAt(index++).Descendants("a").ElementAt(0).Descendants("img").ElementAt(0).GetAttributeValue("src", "");
movie.movieTitle = htmlPage.DocumentNode.Descendants("td").ElementAt(index++).InnerText;
movieList.Add(movie);
}
}
}
}
Я предполагаю, что 'searchbar' является' ComboBox'. – xoxox
Что такое 'movieList' в' bgWorker_Completed'? – xoxox
@xoxox Да, это ComboBox Я использую класс Movies для создания списка фильмов. Этот класс является причиной замораживания, и для этого мне нужен другой поток. – Marius