Отмена длительной операции - PullRequest
3 голосов
/ 14 июня 2010

У меня работает фоновый рабочий, который копирует огромный файл (несколько ГБ), и я хотел бы знать, как отменить процесс в середине копии.Я могу проверить свойство CancellationPending перед копированием, но не знаю, как это сделать, когда копирование уже выполняется.

if (worker.CancellationPending) // check cancellation before copy 
{   
    e.Cancel = true;
}
else
{    
    File.Copy("sourceFile", "destinationFile"); // need to cancel this
}

Пожалуйста, сообщите, спасибо!

Ответы [ 5 ]

6 голосов
/ 14 июня 2010

Я не уверен, но думаю, что File.Copy поддерживается функцией CopyFile в winapi, которая не поддерживает эту функцию.

Вы должны указывать на CopyFileEx, который разрешает метод обратного вызова при копировании части файла.

2 голосов
/ 14 июня 2010

Единственный известный мне способ - использовать CopyFileEx (kernel32)

0 голосов
/ 14 июня 2010

Вместо использования File.Copy или любой другой функции копирования вы также можете скопировать файл самостоятельно (чтение из исходного потока, запись в целевой поток) в виде фрагментов. В цикле, необходимом для копирования всех фрагментов, вы можете проверить, прерывать ли операцию, а затем выполнить необходимые операции, чтобы прервать процесс копирования.

0 голосов
/ 14 июня 2010

Скопируйте файл кусками.Между кусками проверьте, была ли операция отменена.

Это может пахнуть как переизобретение колеса, но это вариант, если вы не хотите импортировать CopyFileEx.

0 голосов
/ 14 июня 2010

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

...