구버전 : https://gall.dcinside.com/m/csharp/635
public class FuncBlock<I, O> : IDataflowBlock
{
readonly ActionBlock<Task> a = new ActionBlock<Task>(t => t.RunSynchronously());//캔따개 역할
public Task Completion => a.Completion;
public void Complete() => a.Complete();
void IDataflowBlock.Fault(Exception ex) => ((IDataflowBlock)a).Fault(ex);
readonly Func<I, O> invoke;
public FuncBlock(Func<I, O> f) => invoke = f;
public FuncBlock(Func<I, Task<O>> f) : this(i => f(i).Result) { }
public bool Post(I input, out Task<O> t) => a.Post(t = new Task<O>(() => invoke(input))); //Post실패시 무한 대기 위험 있음.
public Task<O> Invoke(I input) => Post(input, out var t) ? t : throw new Exception($"Block에 Post하지 못했습니다. {new { Completion.Status, }}", Completion.Exception);
}
실제 효율이 얼마나 개선된지는 모르겠고 코드가 줄어듬
써보고 버그나면 고침
https://gist.github.com/naratteu/9d9836ec34aaf0f2c09a638c15696810