параллельный.вызов токена отмены - PullRequest
2 голосов
/ 22 июня 2011

При использовании Parallel.Invoke вы можете передать ParallelOptions, который включает в себя CancellationToken.Можно ли использовать этот токен в вызовах, чтобы определить, должен ли происходить выход?Следует ли использовать ссылку на CancellationTokenSource из действий?

CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;

Parallel.Invoke(po,
        new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 1"); }),
        new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 2"); }),
        new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 3"); cts.Cancel(); }),
        new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 4"); }),
        new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 5"); })
    );

Обновление: отмена произошла слишком поздно.Я делал это вне вызванных методов.

Примечание. Если отмена произойдет достаточно скоро, Parallel.Invoke сгенерирует вызов, но в противном случае вызываемые методы завершатся без ошибок.

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

На msdn есть довольно хороший пример.

кажется, что вы можете запросить статус и использовать cancellationToken, чтобы подать сигнал планировщику.

http://msdn.microsoft.com/en-us/library/dd997364.aspx

2 голосов
/ 22 июня 2011

Да. Например:

CancellationToken ct = tokenSource.Token;

ParallelOptions po = new ParallelOptions { CancellationToken = ct; };

Parallel.Invoke(po
    () => { Console.WriteLine(ct.IsCancellationRequested); },
    // etc
);

В частности, вы можете передать токен отмены в другие методы, которые могут распространить его на асинхронные задачи.

...