优雅地杀死一个持续时间太长的方法的调用

时间:2014-02-24 21:48:29

标签: c# backgroundworker kill-process

我有一个后台工作人员,负责下载大量小文件并将其保存在硬盘上。为了让你了解规模,3000万个文件。

后台工作程序是可取消的,我可以在开始下载文件后取消。但是我在调​​用外部dll方法时无法取消,该方法告诉我要下载哪些文件。我有一个带有我调用的方法的外部dll,它返回这个长文件列表。只需要几个小时即可完成一个方法。

我真的需要取消这个电话。例如,用户对其拍摄时间和点击取消感到沮丧。现在,我等到该方法完成才能取消。

以下是一个例子:

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    TimeIntensiveMethod(); // Can take up to an hour - can't cancel it

    for (int i = 0; i < 1000; i++)
    {
        if (worker.CancellationPending)
            break;

        ShortDurationMethod(); // The wait to complete before cancelling is unperceivable
    }
}

在这个例子中,我希望能够在TimeIntensiveMethod上取消它正在工作的中间。这可能吗?

2 个答案:

答案 0 :(得分:3)

取消本机代码执行的唯一或多或少可靠的方法是在单独的进程中运行它,并停止该进程。

只有当该进程不执行I / O时,它才能可靠地工作。如果是,谁知道如果在I / O操作过程中被中断会发生什么。

有几种方法可以在单独的进程中运行调用,并在整个进程边界内封送参数和返回值。使用WCF是一种选择。使用managed add-in framework是另一个(虽然我不推荐它)。使用System.Diagnostics.Process类运行控制台程序并捕获输出流可能是最佳选择。

答案 1 :(得分:-1)

作为进程外调用的一个简单而轻松的替代方法,您可以简单地启动一个新线程,在其中进行调用,并根据您的意愿从主线程终止该线程。

你会有一些资源泄漏,但如果它是一个用户驱动的应用程序,它可能是可以接受的......

编辑:

另一种方法是故意从后面BREAK过程,例如,如果它是文件枚举,锁定一些文件以使枚举失败并退出...