Поток, содержащий await в .NET 4.5 и Async CTP 4.0, может зависнуть по разным причинам, например. так как удаленный клиент не ответил. Конечно, WaitForAny, когда мы ждем еще и какую-то задачу по таймауту, — очевидное решение для восстановления высокоуровневого потока. Тем не менее, это не решает всех возможных проблем.
У меня есть следующие вопросы:
Что происходит с контекстом await, который никогда не возвращается? Я понимаю, что это создаст утечку памяти. Я прав?
Как я могу проверить в отладчике или с помощью соответствующего API, сколько висящих "ожидающих" существует в приложении?
Можно ли перечислить их глобально?
Если 3. верно, можно ли принудительно отменить задачи для этих *await* (т.е. очистить)?
Примечание. В вопросе 4 я не спрашиваю об элементах отмены, которые будут использоваться во время явного создания задачи. Я имею в виду случай, когда задача создавалась косвенно:
async Task<bool> SomeTask()
{
await Something();
...
return true;
}
Мотивация этого вопроса:
- Попытка избежать утечек памяти
- Попытка усложнить код слишком большим количеством случаев, связанных с токенами отмены.
- Во многих ситуациях тайм-аут не известен заранее для каждой Задачи низкого уровня, но поток высокого уровня может использовать просто подход восстановления: «Мы застряли? Ничего, просто очистите и начнем сначала».