我如何等待我的自定义数据流块完成?

问题描述 投票:1回答:1

我正在使用ITargetBlock,并且已成功创建了一个自定义数据流块。但是,我不能全神贯注于实现“完成”任务。我目前将其定义为:

public Task Completion { get; }

一旦构建了数据流线,我将尝试等待此完成任务,但会引用一个“空”对象。这是由于我没有将完成任务分配给任何事物。

我应该将此分配给什么?我认为它会自动与数据流块关联,但默认为空...

我应该将完成分配给什么?

c# async-await task-parallel-library tpl-dataflow
1个回答
0
投票

实现代码Completion后,应在调用Complete()后完成所有“运行中”的工作。

这可以通过TaskCompletionSource完成

public Example<TInput>() : ITargetBlock 
{
    private TaskCompletionSource<Object> tcs = new TaskCompletionSource<Object>()
    public Task Completion { get; }

    public Example()
    {
        Completion = tcs.Task;
    }

    public void Complete()
    {
        // We run this on a background thread because we don't want the call to Complete be blocking.
        Task.Run(() => {
            // Wait here for any currently executing async work your dataflow block does to finish.
            // ...

            tcs.TrySetResult(null);
        }
    }

    public void Fault (Exception exception)
    {
        // Cancel here any running work.
        // ...

        tcs.TrySetException(exception);
    }

    public DataflowMessageStatus OfferMessage(DataflowMessageHeader messageHeader, TInput messageValue, ISourceBlock<in TInput> source, bool consumeToAccept)
    {
        if (Completion.IsCompleted)
        {
            return DataflowMessageStatus.DecliningPermanently;
        }
        // ...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.