2013-12-04 2 views
0

Надеюсь, это простой вопрос. У меня есть эта строка кода:Продолжение не запускается, если предыдущее отменено

Task operation = Task.Factory.StartNew(() => this.Start(arg), m_token.Token) 
    .ContinueWith((previous) => Completed(previous, arg), TaskScheduler.FromCurrentSynchronizationContext()); 

Объект агд содержит CancellationToken.

Если я отменил задание (которое я подтвердил, что оно отменено), метод Completed вообще не вызывается. Не уверен, что здесь происходит, и что я сделал неправильно.

Возможно, это важный бит: я использую блок обработки исключений Enterprise Library, который обертывает все исключения. Однако все работает отлично, когда «Исход» вызывает исключение; вызывается Completed.

+1

[Этот пример] (http://pastie.org/8527751) работает нормально; единственная разница между этим и вашим кодом - это scheduler/sync-context (который является PITA для работы); могу ли я попросить вас попробовать код из этой пасти, но с вашим кодом планировщика/синхронизации-контекста (т. е. «TaskScheduler.FromCurrentSynchronizationContext()»)? что происходит тогда? –

+0

Из любопытства: what * is * sync-context, который вы используете? (Я тестировал с использованием базовой реализации, и снова: код работал нормально, даже используя 'TaskScheduler.FromCurrentSynchronizationContext()') –

+0

Я попробую пример. Это приложение WinForms, поэтому метод Completed должен запускаться в потоке графического интерфейса. – Nezreli

ответ

0

Возвращенная задача не будет назначена на выполнение до завершения текущей задачи . Если критерии, указанные в параметре продолжения , не выполняются, задача продолжения будет отменена вместо запланированной.

Подробнее here.

+3

отмененные задачи все еще вызывают продолжения, хотя, в зависимости от продолжения выборов - и продолжения продолжения по умолчанию действительно поднимают продолжение (тестирование локально) –

+0

Да, согласно документации Завершенный метод должен запускаться после отмены, но это не так. – Nezreli

Смежные вопросы