Случай использования
Я разрабатываю небольшое приложение на C#, которое вызывается другим приложением для извлечения данных из Интернета. Он работает как процесс сам по себе, но почти все взаимодействие с ним управляется вызывающим приложением. Поэтому он не имеет графического интерфейса. Однако я хотел бы добавить индикатор выполнения, используя WPF, который отображается во время определенных данных, которые могут занять до минуты. Достаточно легко оценить, сколько работы сделано и сколько осталось, и поэтому я считаю, что индикатор прогресса подходит.Вызов методов в окне WPF из основной темы
Исследования, проведенные
У меня есть справедливое понимание многопоточности после прочтения больших частей PDF Albahari на резьб (http://www.albahari.info/threading/threading.pdf). Я также прочитал много сообщений о SO и MSDN в этом вопросе. В большинстве сообщений предлагается использовать фонового работника для долговременного извлечения данных, сохраняя графический интерфейс в основном потоке и предлагая решения с использованием рабочего фона. Это неудобно в этом сценарии, хотя главная задача - поиск данных, а не взаимодействие с графическим интерфейсом.
Я потратил кучу часов, пытаясь понять разные учебники и форумы, пытаясь приспособить их к моей проблеме, но мне это не удалось, и теперь я почти полностью вернусь к квадрату. В основном я хотел бы, чтобы в конечном итоге со следующими двумя классами, описанных ниже:
ProgressBarWindow
public partial class ProgressBarWindow : Window
{
public ProgressBarWindow()
{
InitializeComponent();
}
public void setValue(int value)
{
// This function should be available from the main thread
}
}
Querier
Public class Querier
{
public List<Item> getItems()
{
// call ProgressBarWindow.setValue(0);
...
// call ProgressBarWindow.setValue(100);
// call ProgressBarWindow.Close();
}
}
Это мое понимание того, что интерфейс должен работать под единым резьб и поэтому мой объект ProgressBarWindow
не может быть создан в новом потоке и в то же время доступен для основного потока (типа).
Dispatcher.BeginInvoke кажется моим спасителем здесь, но до сих пор мне не удалось выяснить, что должно пойти в класс Querier
и что нужно делать в классе ProgressBarWindow
. Как я могу заставить эти два потока взаимодействовать с одним и тем же экземпляром ProgressBarWindow?
Пожалуйста, спросите, нужна ли вам дополнительная информация, и я попробую уточнить.
Пожалуйста избежать 'SetXXX()' и 'getXXX()' синтаксис. он выглядит так много, как я, я собираюсь бросить. Вместо этого используйте C# -подобный код и создайте правильные свойства. –
Point принят! Я обычно стараюсь. – Anders