假设我有一个处理器,他的工作是将文件持久存储到磁盘上。这是在观察要处理的文件的BlockingCollection<T>时作为Task运行的。
如果任务被取消,但仍有文件需要保存到磁盘上,那么这样做的最佳做法是什么?
让任务在退出之前快速地将剩余的文件写回磁盘是很方便的,尽管我不确定这是否与取消任务的原则相冲突(因为取消应该尽可能快地发生)。
另一种选择是在取消任务后进行第二个过程,该任务的任务是将剩余的文件写入磁盘。
代码示例:
class FileProcessor
{
private readonly BlockingCollection<Stream> input;
public FileProcessor(BlockingCollection<Stream> input)
{
_input = input;
}
public Task Run(CancellationToken cancellationToken,
BlockingCollection<Stream> input)
{
return Task.Factory.StartNew(() =>
{
foreach (Stream stream in
input.GetConsumingEnumerable(cancellationToken))
{
WriteToDisk(stream);
}
// Should I call WriteRemaining here or should I have
// a process running after this task exited which
// will call WriteRemaining
WriteRemaining();
});
}
public void WriteRemaining()
{
foreach (Stream stream in input)
{
WriteToDisk(stream);
}
}
}我知道这是一个有点悬而未决的问题,应用程序/要求/要写入的文件量也起到了一定的作用,但我在这里寻找一般的指导方针/最佳实践。
发布于 2011-11-17 00:33:47
Cancellation is a cooperative action在使用任务并行库时,是的,建议取消是一种快速操作。
请记住,这是取消,而不是取消和清理。如果由于取消而需要执行额外的操作,则这些操作应该发生在被取消的原始任务之外。
请注意,这并不能阻止您调用ContinueWith并在新的Task中执行操作,该操作会检查IsCanceled property是否返回true,然后基于此执行清理。
这里的关键点是,您不想阻止被取消的原始Task,但您可以自由地启动一个新的Task,以执行由于取消而需要执行的任何清理工作。
https://stackoverflow.com/questions/8154318
复制相似问题