public ITargetBlock<T> SkipActionBlock<T>(Func<T, Task> action, out Task completion, DataflowBlockOptions? opt = null)
{
BufferBlock<T> buf = opt is ninew();
completion = loop();
return buf;
async Task loop()
{
while (await buf.OutputAvailableAsync(token))
if (buf.TryReceiveAll(out var block))
await action(block.Last());
}
}
별도의 block클래스를 만들고 싶지만, 다른block들처럼 쓸수있도록 내부구현을 완벽히 지원할 자신이 없어서 절차속의 함수 하나로 퉁침
+20230324 캔슬도 옵션으로
ITargetBlock<T> SkipActionBlock<T>(Func<T, Task> action, out Task completion, DataflowBlockOptions? opt = null)
{
BufferBlock<T> buf = opt switch { null => new(), _ => new(opt) };
completion = loop();
return buf;
async Task loop()
{
while (await buf.OutputAvailableAsync())
if (buf.TryReceiveAll(out var block))
await action(block.Last());
}
}
루프에 사용하는 buf를 WeakReference로 받아서 GC때 반영되도록?
gist에 통합
https://gist.github.com/naratteu/9d9836ec34aaf0f2c09a638c15696810