【问题标题】:Cancelling long operation取消长时间操作
【发布时间】:2011-03-03 12:56:09
【问题描述】:

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

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

请指教,谢谢!

【问题讨论】:

    标签: c# multithreading backgroundworker cancellation


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 在这种情况下杀死线程可能无效。见Thread.Abort() on MSDNIf Abort is called on a managed thread while it is executing unmanaged code, a ThreadAbortException is not thrown until the thread returns to managed code.
        • 如果您知道 Windows 资源管理器是以这种方式实现的,您会觉得省钱吗? ...我也没有。
        • @Eddie:这不是事实,只是暗示不要朝那个方向发展,抱歉造成混乱;-)
        【解决方案4】:

        分块复制文件。在chunk之间,检查操作是否被取消。

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-08-29
            • 1970-01-01
            • 2012-04-03
            • 1970-01-01
            • 2021-10-29
            • 2013-01-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多