biegnę Owin własnym gospodarzem Web API, z typowym kontrolerze tak:Async Web Api Controller - Jak radzić sobie z odwołaniami?
[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);
}
Zakładając _db.Refresh() jest długo działa (kilka sekund), a czasami zgłasza wyjątek.
Problem udało mi się odtworzyć to:
- Zapytanie uderza metody _db.Refresh zostanie wystrzelone
- Zamówienie jest anulowane (gniazdo zamknięte)
Wynik parametru _db.Refresh nie jest już oczekiwany - ponieważ widzę, że zwraca wyjątek, pojawia się on po niezaobserwowanym działaniu wyjątku TPL, gdy zadaniem jest GCd ...
Mayb Ze względu na takie interakcje zespół .net zmienił nieobsługiwaną politykę wyjątków, aby nie zburzyć procesów (myślę, że 4.5) ... więc jaki jest dobry wzór tego problemu? W szczególności dla samoobsługowej WebApi używającej OWIN-a, ponieważ wciąż loguję niezobowiązujące wyjątki jako FATAL :)
Mogę sprawić, że _db.Refresh() otrzyma token anulowania, ale jak/kiedy ustawię token anulowania dla rozłączeń/anulowań w webapi hosta?
Czy to naprawdę rozwiązuje problem, że zadanie zwrócone przez "RefreshElement" może nigdy nie zostać zaobserwowane? – usr
@usr Pytanie brzmi, które 'zadanie' nie będzie obserwowane, wewnętrzne zadanie lub wyjście. Ale masz rację, nie jestem pewien, dlaczego założyłem, że to było wyjście. –
Myślę, że wewnętrzne zadanie będzie obserwowane przez oczekujące, które wciąż trwa. To nie jest anulowane. W rzeczywistości "RefreshElement" nigdy nie jest anulowane. – usr