синхронизация задач - PullRequest
       21

синхронизация задач

0 голосов
/ 25 февраля 2011

У меня есть алгоритм, который выполняется в задаче из tpl.

На каждой итерации я хочу выполнить обработчик событий, который обновляет индикатор выполнения в клиенте winforms (через preseter mvp)

public delegate void NotifyAboutIterationEnd(int iteration);

public event NotifyAboutIterationEnd Notify;

 var task = Task.Factory.StartNew(() =>
   {
       foreach (..
       {
var t = Task.Factory.StartNew(p =>
                                             {
                                                 Notify(++index);
                                             },CancellationToken.None,TaskCreationOptions.None,Scheduler);
           foreach (..

Проблема в том, что в режиме отладки, который я вижу, сначала выполняется код из основной задачи.Когда этот код заканчивается, отладчик переходит к внутренней задаче.Как я могу синхронизировать это?Я хочу обновлять индикатор выполнения в каждой итерации.Теперь эффект таков, что у меня уже есть результат алгоритма в datagridview, и тогда я вижу рабочий (обновляющий) индикатор выполнения: /

1 Ответ

0 голосов
/ 02 марта 2011

Я полагаю, что вы Scheduler переменная - это экземпляр TaskScheduler для контекста синхронизации пользовательского интерфейса, и поэтому вы просто пытаетесь быть последовательным, используя Task API вместо простого использования Control/Window::Invoke напрямую?

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

...