取消长时间操作

3

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

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

请指导,谢谢!
5个回答

6

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

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


2

0
据我所知,后台工作线程最适合运行大量的小操作。我知道这很麻烦,但你可能需要考虑为复制操作创建一个单独的线程。这样,如果你正在进行复制操作,你可以直接终止该线程。(不过我不确定这对复制操作会产生什么影响 - 我不知道是否会留下临时文件。)

1
在这种情况下,终止线程可能是无效的。请参阅MSDN上的Thread.Abort()如果在托管线程执行非托管代码时调用Abort,则直到该线程返回到托管代码后才会抛出ThreadAbortException。 - Humberto
如果你知道Windows Explorer是这样实现的,你会感到安全吗?...我也不会。 - Frank Bollack
@ Eddie:那不是事实,只是一个提示,不要走那个方向,对于造成的困惑我很抱歉;-) - Frank Bollack

0

将文件分块复制。在块之间检查操作是否已取消。

这可能看起来像是重新发明轮子,但如果您不想使用 dllimport CopyFileEx,则可以选择这个选项。


0

不必使用File.Copy或其他复制函数,您也可以自己复制文件(从源流读取,写入目标流)以块为单位。在循环中,您可以检查是否要中止操作,然后执行必要的操作来中止复制过程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接