Closed
Description
As in the title. Any of these errors only happen when multiple iterations are attempted and the source is a taskSeq
CE, not when the source is a user-defined or library defined IAsyncEnumerator<_>
, used with the TaskSeq
library functions.
I already started investigating this issue and it has to do with properly resetting state when "reaching the end" and when "getting an enumerator over the same resource". See #36 continued: #42.
Operation not valid error, MoveNextAsync()
// this throws: InvalidOperationException: Operation is not valid due to the current state of the object.
task {
let tskSeq = taskSeq { yield 1; yield 2 }
let enum = tskSeq.GetAsyncEnumerator()
let! isNext = enum.MoveNextAsync() // true
let! isNext = enum.MoveNextAsync() // true
let! isNext = enum.MoveNextAsync() // false
let! isNext = enum.MoveNextAsync() // error here
()
}
Operation not valid error, multiple GetAsyncEnumerator()
with MoveNextAsync()
// throws: InvalidOperationException: Operation is not valid due to the current state of the object.
task {
let tskSeq = getEmptyVariant variant
use enumerator = tskSeq.GetAsyncEnumerator()
let! isNext = enumerator.MoveNextAsync()
use enumerator = tskSeq.GetAsyncEnumerator()
let! isNext = enumerator.MoveNextAsync() // throws here
()
}
Transition State error
// this throws:
// InvalidOperationException:
// An attempt was made to transition a task to a final state when it had already completed.
task {
let tskSeq = taskSeq { yield 1; yield 2 }
let ts1 = tskSeq |> TaskSeq.map (fun i -> i + 1)
let result1 = TaskSeq.toArray ts1
let ts2 = ts1 |> TaskSeq.map (fun i -> i + 1)
let result2 = TaskSeq.toArray ts2 // error here
()
}