почему-то кажется, что мои исключения перехватываются методом, в котором они выполняются. Вот код для вызова метода. Как видите, я создаю токен отмены с тайм-аутом. Я регистрирую метод для вызова при срабатывании токена отмены, а затем запускаю новую задачу. Токен отмены работает нормально. Как и зарегистрированный метод.
var cancellationToken = new CancellationTokenSource(subscriber.TimeToExpire).Token;
cancellationToken.Register(() =>
{
subscriber.Abort();
});
var task = Task<bool>.Factory.StartNew(() =>
{
subscriber.RunAsync((T)messagePacket.Body, cancellationToken);
return true;
})
.ContinueWith(anticedant =>
{
if (anticedant.IsCanceled)
{
Counter.Increment(12);
Trace.WriteLine("Request was canceled");
}
if (anticedant.IsFaulted)
{
Counter.Increment(13);
Trace.WriteLine("Request was canceled");
}
if (anticedant.IsCompleted)
{
Counter.Increment(14);
}
Следующий фрагмент кода — это метод, который, кажется, не только выдает исключение (ожидаемое поведение, но и перехватывает исключение.
public async override Task<bool> ProcessAsync(Message input, CancellationToken cancellationToken)
{
Random r = new Random();
Thread.Sleep(r.Next(90, 110));
cancellationToken.ThrowIfCancellationRequested();
return await DoSomethingAsync(input);
}
Исключение вызывается токеном отмены, но, согласно intellitrace, оно перехватывается в конце метода. Я пробовал несколько разных вариантов, включая создание собственного исключения, но независимо от того, что функция continuewith всегда выполняет IsComleted или выполняет код завершения. Любые идеи о том, что я делаю неправильно? Спасибо
RunAsync()
иProcessAsync()
? - person svick   schedule 25.07.2012