Рекомендации по отмене задач

Допустим, у меня есть процессор, задача которого - сохранять файлы обратно на диск. Это выполняется как задача , при этом отслеживается BlockingCollection для обработки файлов.

Когда задача отменяется, а файлы, которые нужно сохранить на диск, еще остаются, что будет для этого хорошей практикой?

Было бы удобно позволить задаче прямо перед выходом быстро записать оставшиеся файлы обратно на диск, хотя я не уверен, противоречит ли это философии отмены задачи (поскольку отмена должна происходить как можно быстрее).

Другой вариант - выполнить вторую процедуру после отмены задачи, задача которой - записать оставшиеся файлы на диск.

Пример кода:

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);
        }
    }
}

Я знаю, что это немного открытый вопрос, приложение / требования / количество файлов для записи также играют роль, но я ищу здесь общие рекомендации / лучшие практики.

8
задан casperOne 16 November 2011 в 16:26
поделиться