Отчеты о задачах завершены, но все еще блокируют результаты? - PullRequest
2 голосов
/ 16 февраля 2012

Я столкнулся с некоторым странным поведением при использовании класса .Net 4 System.Threading.Tasks .Лучше всего продемонстрировать этот пример:

var t = FunctionThatReturnsTaskAsync();
Trace.TraceInformation("Completed: " + t.IsCompleted);
return t.Result;

Вывод: " Завершено: true ", но код (один раз в несколько тысяч запусков) затем блокируется в t.Result навсегда.Он не возвращает и не генерирует исключение.Как это может быть!

Возвращаемое задание выполняется в несколько раз быстрее, поэтому неудивительно, что оно может быть выполнено во второй строке.Загадка в том, почему t.Result блокируется.

1 Ответ

1 голос
/ 01 марта 2012

Асинхронные методы возвращают сами задачи, у вас может быть задача >, и внутренняя задача возвращается до «завершения» из-за «асинхронности», а внешняя задача <> считает, что она завершена.

См. Записи блога Стивена Туба по этому вопросу:

http://blogs.msdn.com/b/pfxteam/archive/2012/02/08/10265476.aspx

http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx

Позвольте мне вынести соответствующую цитату:

Чтобы понять этот эффект, нам нужно вспомнить, как работают асинхронные методы. Когда вы вызываете асинхронный метод, он запускается синхронно. Если в методе нет ожидающих событий или если все ожидающие в методе находятся в ожиданиях, которые уже завершены к тому времени, когда ожидают, то метод будет работать полностью синхронно. Однако, когда метод встречает первое ожидание, которое возвращает, асинхронный метод возвращается. В случае асинхронного метода, который возвращает задачу или задачу, метод в этот момент возвращает задачу или задачу, которая представляет выполнение асинхронного метода, и вызывающая сторона может использовать эту задачу для ожидания синхронного (например, Wait ()) или асинхронного (например, await, ContinueWith) для метода для асинхронного завершения. Однако, в случае метода void, дескриптор не возвращается. Таким образом, асинхронные пустые методы часто называют «огонь и забудь».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...