Observable.Do , . SelectMany , . Rx 2.0, SelectMany, Task<T>. ( concurrency, Task/Observable coop.)
var q = from value in src
from _ in F(value.X).AsVoidAsync()
from __ in F(value.Y).AsVoidAsync()
select value;
, , Do, , src , , F . , SelectMany , Select->Merge; , , Select->Concat.
var q = src.Select(x => Observable.Defer(() => F(x).ToObservable())).Concat();
Defer, F(x) .
AsVoidAsync:
IObservable<T> T, Task void, Rx , a Task<T> a Task. Rx System.Reactive.Unit struct T:
public static class TaskExtensions
{
public static Task<Unit> AsVoidAsync(this Task task)
{
return task.ContinueWith(t =>
{
var tcs = new TaskCompletionSource<Unit>();
if (t.IsCanceled)
{
tcs.SetCanceled();
}
else if (t.IsFaulted)
{
tcs.SetException(t.Exception);
}
else
{
tcs.SetResult(Unit.Default);
}
return tcs.Task;
},
TaskContinuationOptions.ExecuteSynchronously)
.Unwrap();
}
}
, ToObservable.