Как реализовать глобальную попытку try..finally в TPL? - PullRequest
0 голосов
/ 31 марта 2012

У меня есть асинхронный метод, который возвращает задачу.Время от времени мой процесс перерабатывает / перезапускает.Работа прерывается в середине Задачи.Есть ли более или менее общий подход в TPL, чтобы я мог хотя бы зарегистрировать, что Задача была прервана?

  1. Я размещаюсь в ASP.NET, поэтому я могу использовать IRegisteredObject для отмены задач с CancellationToken.Мне не нравится это однако.Мне нужно передать CancellationToken во всех методах, и у меня их много.
  2. try..finally в каждом методе, кажется, даже не поднять.ContinueWith также не работает

Любой совет?

У меня есть единственное место, где я запускаю свои асинхронные задачи, однако каждая задача может иметь любое количество дочерних задач.Чтобы получить представление:

class CommandRunner
{
  public Task Execute(object cmd, Func<object, Task> handler)
  {
    return handler(cmd).ContinueWith(t => 
    {
       if (t.State = == TaskStatus.Faulted)
       {
          // Handle faultes, log them
       }
       else if (x.Status == TaskStatus.RanToCompletion)
       {
          // Audit
       }
    })
  }
}

1 Ответ

0 голосов
/ 31 марта 2012

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

...