Допустим, у меня есть процессор, задачей которого является сохранение файлов на диске. Это работает как Task
, при этом наблюдается BlockingCollection<T>
для файлов для обработки.
Когда задача отменяется, и все еще есть файлы, которые должны быть сохранены на диск, что будет хорошей практикой для этого?
Было бы удобно разрешить задачу прямо перед выходом быстро записать файлы, оставшиеся обратно на диск, хотя я не уверен, противоречит ли это философии отмены задачи (поскольку отмена должна происходить как можно быстрее).
Другой вариант - выполнить вторую процедуру после отмены задачи, задачей которой является запись оставшихся файлов на диск.
Пример кода:
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);
}
}
}
Я знаю, что это немного открытый вопрос, приложение / требования / количество файлов для записи также играют роль, но я ищу общее руководство / лучшие практики здесь.