Я бегу Owin Самостоятельное размещение веб-Апи, с типичным контроллером так:Async Web Api Controller - Как обрабатывать отмены?
[HttpGet]
[Route("refresh/{secId}")]
[ResponseType(typeof(int))]
public async Task<IHttpActionResult> RefreshElement(int secId)
{
var count = await _db.Refresh(secId);
if (count == 0)
return NotFound();
return Ok(count);
}
Предполагая _db.Refresh() давно работает (несколько секунд), а иногда выбрасывает исключение.
Проблема я удалось воспроизвести это:
- Запрос попадает метод, _db.Refresh увольняют от
- Запрос отменяется (гнездо закрыто)
Результат от _db.Refresh больше не ждёт - потому что я вижу, когда он возвращает исключение, он появляется через незаметную обработку исключений TPL, когда задача GCd ...
Mayb e из-за таких взаимодействий команда .net изменила необработанную политику исключений, чтобы не срывать процессы (4.5, я думаю) ... так что хорошая модель из этой проблемы? В частности, для самостоятельного размещения WebApi с использованием OWIN - поскольку я все еще регистрирую незаметные исключения как FATAL :)
Я могу сделать _db.Refresh() взять маркер отмены, но как/когда я устанавливаю токен отмены для разъединений/отменяет в собственном хозяине webapi?
Это действительно решит проблему, что задача, возвращаемая 'RefreshElement', никогда не будет наблюдаться? – usr
@usr Вопрос заключается в том, что 'Задача' будет незаметной, внутренней задачей или фоном. Но вы правы, я не уверен, почему я предположил, что это был выход. –
Я думаю, что внутренняя задача будет наблюдаться ожиданием, которое все еще работает. Это не отменяется. Фактически 'RefreshElement' никогда не отменяется. – usr