구버전 : 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);

}


실제 효율이 얼마나 개선된지는 모르겠고 코드가 줄어듬

써보고 버그나면 고침