【发布时间】:2008-10-27 23:19:17
【问题描述】:
我有一个正在运行的循环,它将处理 1000 条记录,目前,一旦循环运行,它就无法停止,用户必须等到它完成。当有人单击“取消”按钮时,如何停止循环?我如何闯入其他例行程序?
谢谢
【问题讨论】:
标签: c# multithreading
我有一个正在运行的循环,它将处理 1000 条记录,目前,一旦循环运行,它就无法停止,用户必须等到它完成。当有人单击“取消”按钮时,如何停止循环?我如何闯入其他例行程序?
谢谢
【问题讨论】:
标签: c# multithreading
您可以在它自己的线程中运行它并中止线程。请注意,这可能会使操作处于错误状态。
相反,您应该创建线程在安全点检查的退出标志。如果它被标记为退出,线程将在安全时立即停止。
【讨论】:
您可以只使用BackgroundWorker 组件。
它是基于事件的,非常易于使用。看起来非常适合您所描述的内容。
它也很好地支持取消信号以及进度报告。
还有很多代码示例,你可以在 google 上查找。
设置WorkerSupportsCancellation 属性使其为真。
backgroundworker1.WorkerSupportsCancellation = true;
在你开始工人之前做。
然后,在循环中,您可以轮询CancellationPending 属性:
if (backgroundWorker1.CancellationPending) return;
只是一个例子,但你应该明白。
【讨论】:
感谢您的回复。这是backgroundworker,但是当我使用backgroundworker1.cancelAsync(); 时出现异常:
“这个 BackgroundWorker 声明它不支持取消。 修改 WorkerSupportsCancellation 以声明它确实支持 取消”
我该如何改变这个?这是继承的代码,对不起!
【讨论】:
正如 Mark 所说,您需要实现某种合作同步。人们经常倾向于在这里使用 Thread.Abort ......但这是个坏主意。
有很多问题可以解决这个问题,例如:“Is there a good method in C# for throwing an exception on a given thread.”
【讨论】:
您可以添加一个设置布尔标志的取消按钮
在循环内的关键点添加“Application.DoEvents”,然后检查布尔标志。如果标志已被触发,请执行清理并退出循环。
【讨论】:
将 BackgroundWorker 上的 WorkerSupportsCancellation 属性设置为 true :-)
您还必须检查循环内的CancellationPending 属性,看看您是否应该中止处理。 chakrit 链接的 MSDN 文章有一个很好的示例代码块
编辑:D'oh,你让我领先了几秒钟 chakrit :)
【讨论】: