В проекте предстоящего C # 8 IAsyncEnumerable
используются ValueTask
и ValueTask<T>
для передачи потенциально синхронных результатов обратно логике потребителя.Они оба имеют свойство IsFaulted
, но в отличие от Task
, свойство Exception
отсутствует.
Возможно ли даже иметь ValueTask
, который не содержит нормальный Task
инаходится в состоянии сбоя или отменено?
Документация ValueTask<T>.Result
указывает на то, что при вызове ее при неудачной задаче будет сброшено содержимое Exception
.Будет ли следующий код иметь смысл извлекать Exception
?
IAsyncEnumerable<int> asyncSequence = ...
ValueTask<bool> valueTask = asyncSequence.MoveNextAsync();
if (valueTask.IsFaulted) {
// this has to work in a non-async method
// there is no reason to block here or use the
// async keyword
try {
var x = valueTask.Result;
} catch (Exception ex) {
// work with the exception
}
}
ValueTask endTask = asyncSequence.DisposeAsync();
if (endTask.IsFaulted) {
// there is no ValueTask.Result property
// so the appoach above can't work
}
Не универсальный ValueTask
не имеет свойства Result
.Как я могу извлечь Exception
тогда?
Как правило, я предполагаю, что применение AsTask
может быть использовано для обоих извлечений, однако, я думаю, что это влечет за собой выделение, что делает использование ValueTask
сомнительным впервое место, как я понимаю.