C#如何将休息发送到另一个子例程?

时间:2008-10-27 23:19:17

标签: c# multithreading

我有一个循环运行,它将处理1000个记录,目前一旦循环运行它就无法停止,用户必须等到它完成。当有人点击“取消”按钮时,如何停止循环?我如何打破其他常规?

由于

6 个答案:

答案 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:)