You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+4-4Lines changed: 4 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,7 +6,7 @@
6
6
7
7
An implementation of [`IAsyncEnumerable<'T>`][3] as a computation expression: `taskSeq { ... }` with an accompanying `TaskSeq` module and functions, that allow seamless use of asynchronous sequences similar to F#'s native `seq` and `task` CE's.
8
8
9
-
* Latest stable version: [0.4.0 is on NuGet][nuget].
9
+
* Latest stable versionis [on NuGet][nuget].
10
10
11
11
## Release notes<!-- omit in toc -->
12
12
@@ -170,15 +170,15 @@ let feedFromTwitter user pwd = taskSeq {
170
170
171
171
## Choosing between `AsyncSeq` and `TaskSeq`
172
172
173
-
The [`AsyncSeq`][11] and `TaskSeq` libraries both operate on asynchronous sequences, but there are a few fundamental differences. The most notable being that the former _does not_ implement `IAsyncEnumerable<'T>`, though it does have a type of that name with different semantics (not surprising; it predates the definition of the modern one). Another key difference is that `TaskSeq` uses `ValueTask`s for the asynchronous computations, whereas `AsyncSeq` uses F#'s `Async<'T>`.
173
+
The [`AsyncSeq`][11] and `TaskSeq` libraries both operate on asynchronous sequences, but there are a few fundamental differences. The most notable being that `TaskSeq` uses `ValueTask`s and state machines for asynchronous computations with much lower overhead, whereas `AsyncSeq` uses F#'s `Async<'T>`.
|**Underlying type**|[`Generic.IAsyncEnumerable<'T>`][3] <sup>[note #1](#tsnote1"Full name System.Collections.Generic.IAsyncEnumerable<'T>.")</sup>| Its own type, also called `IAsyncEnumerable<'T>`<sup>[note #1](#tsnote1"Full name FSharp.Control.IAsyncEnumerable<'T>.")</sup> |
181
+
|**Underlying type**|[`IAsyncEnumerable<'T>`][3] <sup>[note #1](#tsnote1"Full name System.Collections.Generic.IAsyncEnumerable<'T>.")</sup>| Its own type, also called `IAsyncEnumerable<'T>`<sup>[note #1](#tsnote1"Full name System.Collections.Generic.IAsyncEnumerable<'T>.")</sup> |
182
182
|**Implementation**| State machine (statically compiled) | No state machine, continuation style |
|**Disposability**| Asynchronous, through [`IAsyncDisposable`][7]| Synchronous, through `IDisposable`|
@@ -195,7 +195,7 @@ There are more differences:
195
195
|**[`Current`][5]**|[Returns `'T`][5]| n/a |
196
196
|**Cancellation**| See [#133][], until 0.3.0: use `GetAsyncEnumerator(cancelToken)`| Implicit token flows to all subtasks per `async` semantics |
197
197
|**Performance**| Very high, negligible allocations | Slower, more allocations, due to using `async` and cont style |
198
-
|**Parallelism**|Unclear, interface is meant for _sequential/async_ processing | Supported by extension functions |
198
+
|**Parallelism**|Interface is meant for _sequential/async_ processing | Supported by extension functions |
199
199
200
200
<sup>¹⁾ <aid="tsnote1"></a>_Both `AsyncSeq` and `TaskSeq` use a type called `IAsyncEnumerable<'T>`, but only `TaskSeq` uses the type from the BCL Generic Collections. `AsyncSeq` supports .NET Framework 4.6.x and NetStandard 2.0 as well, which do not have this type in the BCL._</sup>
0 commit comments