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