我有一个循环运行,它将处理1000个记录,目前一旦循环运行它就无法停止,用户必须等到它完成。当有人点击“取消”按钮时,如何停止循环?我如何打破其他常规?
由于
答案 0 :(得分:13)
您可以在自己的线程中运行它并中止线程。请注意,这可能会使操作处于不良状态。
相反,您应该创建一个线程在安全点检查的退出标志。如果它被标记为退出,则线程将在它安全的情况下立即停止。
答案 1 :(得分:13)
您可以使用BackgroundWorker组件。
它基于事件,非常易于使用。看起来非常适合您所描述的内容。
它也很好地支持取消信令以及进度报告。
你可以在google上查找很多代码示例。
设置WorkerSupportsCancellation属性,使其成立。
backgroundworker1.WorkerSupportsCancellation = true;
在开始工作人员之前,请执行。
然后,在循环中,您可以轮询CancellationPending属性:
if (backgroundWorker1.CancellationPending) return;
只是一个例子,但你应该明白这一点。
答案 2 :(得分:1)
感谢回复。它是backgroundworker
但是当我使用backgroundworker1.cancelAsync();
时,我得到了例外:
“此BackgroundWorker声明它不支持取消。 修改WorkerSupportsCancellation以声明它支持 消除“
我该如何改变这个?这是继承的代码,对不起!
答案 3 :(得分:0)
正如马克所说,你需要实施某种合作同步。人们经常倾向于想在这里使用Thread.Abort ......但这是一个坏主意。
有很多问题可以解决这个问题,例如请参阅:“Is there a good method in C# for throwing an exception on a given thread.”
答案 4 :(得分:0)
您可以添加一个设置布尔标志的取消按钮
在循环内部在关键点添加“Application.DoEvents”,然后检查布尔标志。如果标志已被触发,请执行清理并退出循环。
答案 5 :(得分:0)
将WorkerSupportsCancellation
上的BackgroundWorker
属性设置为true: - )
您还必须检查循环中的CancellationPending
属性,看看是否应该中止处理。 chakrit链接的MSDN文章有一个很好的示例代码块
编辑:D'哦,你让我在几秒钟内有一个chakrit:)