C# 取消长时间运行 我有一个后台工作者正在运行一个巨大的文件(几个GBS),我想知道如何在拷贝的中间取消这个过程。我可以在复制之前检查CancellationPending属性,但不知道在复制已在进行时如何执行 if (worker.CancellationPending) // check cancellation before copy { e.Cancel = true; } else { File.Copy("sourceFile", "destinationFile"); // need to cancel this }

C# 取消长时间运行 我有一个后台工作者正在运行一个巨大的文件(几个GBS),我想知道如何在拷贝的中间取消这个过程。我可以在复制之前检查CancellationPending属性,但不知道在复制已在进行时如何执行 if (worker.CancellationPending) // check cancellation before copy { e.Cancel = true; } else { File.Copy("sourceFile", "destinationFile"); // need to cancel this },c#,multithreading,backgroundworker,cancellation,C#,Multithreading,Backgroundworker,Cancellation,请告知,谢谢 据我所知,后台工作人员最适合执行许多小操作。我知道这很混乱,但您可能需要考虑为您的复制操作创建一个单独的线程。这样,如果你在拷贝的中间,你就可以杀死线程。(我不确定这会对复制造成什么影响,但是-我不知道使用此方法是否会留下一个临时文件。)我不确定,但我认为file.Copy是由winapi的CopyFile函数支持的,该函数不允许此功能 您应该指出,只要复制了文件的一部分,就可以使用回调方法。我知道的唯一方法是使用将文件分块复制。在块之间,检查操作是否已取消 这听起来像是一个轮子的

请告知,谢谢

据我所知,后台工作人员最适合执行许多小操作。我知道这很混乱,但您可能需要考虑为您的复制操作创建一个单独的线程。这样,如果你在拷贝的中间,你就可以杀死线程。(我不确定这会对复制造成什么影响,但是-我不知道使用此方法是否会留下一个临时文件。)

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


您应该指出,只要复制了文件的一部分,就可以使用回调方法。

我知道的唯一方法是使用将文件分块复制。在块之间,检查操作是否已取消


这听起来像是一个轮子的改造,但如果你不想使用dllimport CopyFileEx,这是一个选项。

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

在这种情况下,终止线程可能无效。请参阅:
如果托管线程在执行非托管代码时调用了Abort,则在该线程返回托管代码之前不会引发ThreadAbortException。
如果您知道Windows资源管理器是以这种方式实现的,您会觉得保存吗。。。我也是。@Eddie:那不是事实,只是一个不要朝那个方向走的暗示,抱歉搞混了;-)