首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任务取消最佳实践

任务取消最佳实践
EN

Stack Overflow用户
提问于 2011-11-16 23:38:50
回答 1查看 6.9K关注 0票数 8

假设我有一个处理器,他的工作是将文件持久存储到磁盘上。这是在观察要处理的文件的BlockingCollection<T>时作为Task运行的。

如果任务被取消,但仍有文件需要保存到磁盘上,那么这样做的最佳做法是什么?

让任务在退出之前快速地将剩余的文件写回磁盘是很方便的,尽管我不确定这是否与取消任务的原则相冲突(因为取消应该尽可能快地发生)。

另一种选择是在取消任务后进行第二个过程,该任务的任务是将剩余的文件写入磁盘。

代码示例:

代码语言:javascript
复制
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);
        }
    }
}

我知道这是一个有点悬而未决的问题,应用程序/要求/要写入的文件量也起到了一定的作用,但我在这里寻找一般的指导方针/最佳实践。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-17 00:33:47

Cancellation is a cooperative action在使用任务并行库时,是的,建议取消是一种快速操作。

请记住,这是取消,而不是取消和清理。如果由于取消而需要执行额外的操作,则这些操作应该发生在被取消的原始任务之外。

请注意,这并不能阻止您调用ContinueWith并在新的Task中执行操作,该操作会检查IsCanceled property是否返回true,然后基于此执行清理。

这里的关键点是,您不想阻止被取消的原始Task,但您可以自由地启动一个新的Task,以执行由于取消而需要执行的任何清理工作。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8154318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档