Меня интересует реализация ActionBlock для Framework 4.0, так как кажется, что TPL.Dataflow не поддерживается для Framework 4.0. В частности, меня интересует случай конструктора, который получает делегат Func‹TInput, Task› и случай MaxDegreeOfParallism = 1.
Я думал реализовать это с помощью реактивных расширений, но не знаю, как это сделать. Думал о создании Subject‹TInput› и вызове OnNext на Post, а также об использовании SelectMany и задачи ToObservable, но я не уверен, что делать с планировщиком. Вот набросок того, о чем я думал.
public class ActionBlock<TInput>
{
private readonly TaskCompletionSource<object> mCompletion = new TaskCompletionSource<object>();
private readonly Subject<TInput> mQueue = new Subject<TInput>();
public ActionBlock(Func<TInput, Task> action)
{
var observable =
from item in mQueue
from _ in action(item).ToObservable()
select _;
observable.Subscribe(x => { },
OnComplete);
}
private void OnComplete()
{
mCompletion.SetResult(null);
}
public void Post(TInput input)
{
mQueue.OnNext(input);
}
public Task Completion
{
get
{
return mCompletion.Task;
}
}
public void Complete()
{
mQueue.OnCompleted();
}
}
Я подумал, может быть, с помощью EventLoopScheduler, но я не уверен, что он подходит здесь, так как это асинхронно.
Любые идеи?