取消长时间操作

时间:2010-06-14 13:51:47

标签: c# multithreading backgroundworker cancellation

我有一个后台工作程序正在运行以复制一个巨大的文件(几个GB),我想知道如何在副本中间取消该过程。我可以在复制之前检查CancellationPending属性,但在复制已经进行时不知道如何进行。

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

请指教,谢谢!

5 个答案:

答案 0 :(得分:6)

我不确定,但我认为File.Copy由winapi的CopyFile函数支持,不支持此功能。

你应该指向允许在复制文件的一部分时使用回调方法的CopyFileEx

答案 1 :(得分:2)

我所知道的唯一方法是使用CopyFileEx (kernel32)

答案 2 :(得分:0)

据我所知,后台工作人员最适合进行大量的小操作。我知道它很乱,但您可能想要为复制操作创建一个单独的线程。这样,如果你正处于复制过程中,你可以直接杀死该线程。 (我不确定这会对复制做什么,所以 - 我不知道它是否会在使用这种方法后留下一个临时文件。)

答案 3 :(得分:0)

以块的形式复制文件。在块之间,检查操作是否已被取消。

这可能闻起来就像轮子一样,但如果你不想传播CopyFileEx,这是一个选择。

答案 4 :(得分:0)

您也可以自己复制文件(从源流中读取,写入目标流),而不是使用File.Copy或任何其他复制功能。在复制所有块所需的循环中,您可以检查是否中止操作,然后执行必要的操作以中止复制过程。