我正在使用ITargetBlock,并且已成功创建了一个自定义数据流块。但是,我不能全神贯注于实现“完成”任务。我目前将其定义为:
public Task Completion { get; }
一旦构建了数据流线,我将尝试等待此完成任务,但会引用一个“空”对象。这是由于我没有将完成任务分配给任何事物。
我应该将此分配给什么?我认为它会自动与数据流块关联,但默认为空...
我应该将完成分配给什么?
实现代码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;
}
// ...
}
}