Как я могу использовать многопоточность в приложении Windows Forms для обновления индикатора выполнения? - PullRequest
2 голосов
/ 08 апреля 2010

Есть два объекта. Форма Windows с кнопкой и индикатором выполнения, а также другой объект, который обрабатывает алгоритм.

В объекте алгоритма есть событие и свойство. Событие ProgressChanged, а свойство Progress (что является целым).

В окне вызова кнопка запускает набор шагов в объекте алгоритма. При выполнении каждого шага (или подшагов) происходит событие ProgressChanged, и в окне появляется обработчик событий, который существенно увеличивает индикатор выполнения относительно свойства Progress.

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

Моя проблема в том, что я не совсем уверен, что я делаю, когда дело доходит до многопоточности. Я посмотрел на Control.Invoke и немного растерялся.

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 3 ]

3 голосов
/ 08 апреля 2010

Используйте Backgroundworker. У него есть метод ReportProgress + событие, позволяющее запустить индикатор выполнения без беспокойства об Invoke.

1 голос
/ 08 апреля 2010

Вот пример того, как использовать Invoke для перехода к потоку пользовательского интерфейса, где можно безопасно управлять доступом:

// In some form method, setup the event handler
algorithm.ProgressChanged += new EventHandler(AlgorithmProgressChanged);

private void AlgorithmProgressChanged(Object source, EventArgs args)
{
    if (this.InvokeRequired)
    {
        // Switch to the UI thread
        this.Invoke(new EventHandler(AlgorithmProgressChanged), source, args);
        return;
    }
    // It should be safe to set the progress beyond this point.
    progressBar.Value = algorithm.Progress;
}
0 голосов
/ 08 апреля 2010

Как говорит другой автор, используйте компонент BackgroundWorker. Пояснение и пример кода на: http://ondotnet.com/pub/a/dotnet/2005/07/25/backgroundworker.html

-Oisin

...