Нужен шаблон или решение для длительной работы, которая выполняется в цикле и обновляет пользовательский интерфейс после завершения каждого потока - PullRequest
1 голос
/ 03 декабря 2011

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

У меня есть приложение WPF, которое должно обрабатывать n запросов к указанной базе данных, и после каждой задачи мне нужно обновлять приложение с результатами этой задачи.

foreach(var task in tasks)
{
   // create thread for task to hit a database
   // update ui with result from the task
}

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

Пользовательский интерфейс добавит в таблицу данных строку, отображающую результаты каждой «задачи», выполненной в базе данных.

Спасибо

-bmm

Ответы [ 3 ]

2 голосов
/ 03 декабря 2011

BackgroundWorker с отчетом о проделанной работе сделает именно это. Вы можете включить все, что вам нужно, в свойство UserState и применить его в обработчике событий ProgressChanged.

1 голос
/ 03 декабря 2011

Вы можете использовать новый класс Task, который имеет удобный метод ContinueWith, который позволяет ставить в очередь больше работы после завершения текущей задачи.См .: http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx.

Таким образом, вы можете реализовать поток наподобие:

  1. создание экземпляра задачи с начальным действием
  2. продолжение с обновлением GUI
  3. продолжить со следующей задачей
  4. вернуться к шагу 2
0 голосов
/ 05 декабря 2011

Вы также можете использовать ThreadPool

Вот пример.

      ThreadPool.QueueUserWorkItem(delegate
        {

            //Do something

            //Update ui.
            TextBox.Dispather.Invoke((Action)(() =>
            {
                //Update the control
            }));

        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...