Нужно ли реализовывать фоновый рабочий - PullRequest
0 голосов
/ 13 марта 2012

У меня есть основное приложение с графическим интерфейсом, которое выполняет всю свою работу в сборке, на которую ссылаются. Прямо сейчас я не выполняю работу в фоновом режиме, поэтому он в основном блокирует основной пользовательский интерфейс во время обработки. В моей сборке я добавил довольно много событий, чтобы сообщить о различном прогрессе обратно в основную форму пользовательского интерфейса. В основной форме пользовательского интерфейса я обновляю различные текстовые поля значениями из этих событий. Мой вопрос, во-первых, обработка этих событий происходит намного медленнее. Так должен ли я запускать события во вторичном потоке (из сборки, на которую ссылаются)? Должен ли мой исходный вызов ссылочной (статической) системе работать через фонового работника? Я хотел бы сообщить о различных типах прогресса в отдельном потоке, но не уверен, какой подход использовать для достижения оптимальной производительности.

Спасибо

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Из вашего описания звучит так, будто вы выиграете от многопоточности, поскольку это поможет поддерживать отзывчивость интерфейса.

И самый простой способ сделать это - использовать BackgroundWorker. Начните с проработки одного из множества образцов , затем откусите пулю и вернитесь сюда, если у вас возникнут проблемы.

В ответ на комментарий:

Лучший способ связаться из рабочего потока BackgroundWorker с основным потоком - это вызвать метод BackgroundWorker.ReportProgress, который принимает необязательный параметр объекта userState, который можно использовать для упаковки данных, которые вы хотите передать.

Это вызывает событие BackgroundWorker.ProgressChanged в главном потоке, и данные могут быть обработаны без явного Invoke.

Если вы уже реализовали события, вам придется либо переделать некоторые вызовы для вызова ReportProgress, а не вызывать события, либо реализовать какой-либо адаптер для обработки событий и перенаправить их на вызовы ReportProgress методов.

0 голосов
/ 13 марта 2012

Вы можете запустить свой процесс (метод в другой сборке) в другом потоке и обработать события, вызванные им в главной форме.

Поскольку пользовательский интерфейс не может быть обновлен другим потоком, вы должны обернуть код этих событий в this.Invoke ().

Ex:

private void TheEventRaisedOnAnotherThread(object sender, EventArgs e)
{
    _counter++;
    this.Invoke(new MethodInvoker(delegate() { TextBox1.Text = _counter.ToString(); }));
}
...