1

我有一个程序可以分析源代码。它可以递归遍历一个目录找到所有项目,然后递归遍历项目找到所有源代码。

我想创建一个取消进程按钮,它允许用户停止代码解析。我在后台工作人员中运行代码解析。我希望能够观看取消事件。

问题是弄清楚如何编辑我的代码,以便它会检查该项目并返回到 GUI。解析过程深入了几个方法。

在一个小得多的过程中,我成功地使用了一个线程安全的单例,它有一个布尔值,表示是否已请求取消,并在它运行的地方停止循环。

将此取消请求处理到我的代码中的最佳方法是什么?

编辑:这是一个想法,灵感来自约翰桑德斯的回答。

如果我在我的处理线程中运行一个后台线程来监视 Cancel Singleton 的变化,然后从该进程中抛出一个异常怎么办?这似乎是一种很好的做法? 这不能按预期工作

编辑 2:John Saunders 的回答似乎是目前最好的。当 Singleton 现在为真时,我只会抛出我自己的异常。我会等着看是否提出任何其他解决方案

4

4 回答 4

2

Thread.Abort 是一个坏主意,因为它会在任意点中断线程 - 可能会在您最不希望被中断的地方中断它。

设置一个被取消的线程看到的标志。在每个操作开始时检查它。这个想法是识别代码中可以安全停止的位置,并仅在这些点检查标志。

您可能会发现在这些点抛出异常很有用。异常应该是在到达代码和 UI 之间的边界之前未被代码捕获的异常。那时,您的代码将简单地返回。

于 2009-03-25T17:33:10.327 回答
0

您可以Thread.Abort()在后台工作线程上使用该函数。这会抛出一个ThreadAbortException你可以在你的任何方法中捕获的,但它会在块的末尾自动重新抛出catch

所有finally-blocks 也将被执行。

于 2009-03-25T17:26:59.450 回答
0

听起来您正在使用 .NET backgroundworker 类。我认为您可以将对象参数传递给 RunWorkerAsync 方法,然后 DoWork 事件处理程序参数中的后台线程可以访问该方法。

然后,您可以在 UI 线程中修改该对象(例如更新布尔取消属性)并定期从后台进程中检查它。

于 2009-03-25T17:32:55.397 回答
0

有多种方法可以取消线程操作;所有这些都涉及定期检查标志或其他值以确定线程是否应该继续运行。

我不建议为此功能抛出异常。首先,取消不是一种特殊情况,其次,对于您要实施的内容来说,它是矫枉过正的。

相反,您可以使用一个简单的、线程安全的布尔标志作为可从任何线程访问的类的静态成员,或者使用诸如命名Mutex之类的同步对象。然后,向同步对象发出信号将使线程知道它必须取消。

于 2009-03-25T18:41:18.307 回答