【问题标题】:C# How can I send a break to another sub routine?C# 如何将中断发送到另一个子例程?
【发布时间】:2008-10-27 23:19:17
【问题描述】:

我有一个正在运行的循环,它将处理 1000 条记录,目前,一旦循环运行,它就无法停止,用户必须等到它完成。当有人单击“取消”按钮时,如何停止循环?我如何闯入其他例行程序?

谢谢

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    您可以在它自己的线程中运行它并中止线程。请注意,这可能会使操作处于错误状态。

    相反,您应该创建线程在安全点检查的退出标志。如果它被标记为退出,线程将在安全时立即停止。

    【讨论】:

    • 我喜欢这个想法,退出标志的想法很有吸引力,尽管用户可能会抱怨如果到达它有任何形式的延迟,希望它不会是那么大的过程; )
    • 将需要检查他们赢得消息队列,DoEvents 样式,以获得取消消息。
    • 处理一条记录最多需要 99% 的时间,对吧?如果这需要很长时间,您可能会遇到其他问题。
    • 一旦他们单击“取消”并旋转图形或拉起进度条或其他东西来消除短时间,直到实际取消发生,立即反馈处理延迟。立即响应的“感知”通常就足够了!
    • +1 但也许值得交换两个选项的顺序?通过为我中止线程来创建错误状态的风险使其成为明确的第二选择。
    【解决方案2】:

    您可以只使用BackgroundWorker 组件。

    它是基于事件的,非常易于使用。看起来非常适合您所描述的内容。

    它也很好地支持取消信号以及进度报告

    还有很多代码示例,你可以在 google 上查找。


    设置WorkerSupportsCancellation 属性使其为真。

    backgroundworker1.WorkerSupportsCancellation = true;
    

    在你开始工人之前做。

    然后,在循环中,您可以轮询CancellationPending 属性:

    if (backgroundWorker1.CancellationPending) return;
    

    只是一个例子,但你应该明白。

    【讨论】:

    • 如单独答案中所述,您必须在调用 RunWorkerAsynch() 之前将 WorkerSupportsCancellation 属性设置为 true。你的工作代码仍然需要在循环时检查标志。
    【解决方案3】:

    感谢您的回复。这是backgroundworker,但是当我使用backgroundworker1.cancelAsync(); 时出现异常:

    “这个 BackgroundWorker 声明它不支持取消。 修改 WorkerSupportsCancellation 以声明它确实支持 取消”

    我该如何改变这个?这是继承的代码,对不起!

    【讨论】:

    • backgroundwork1.WorkerSupportsCancellation = true; /* 创建 backgroundworker1 实例后立即执行此操作 */
    【解决方案4】:

    正如 Mark 所说,您需要实现某种合作同步。人们经常倾向于在这里使用 Thread.Abort ......但这是个坏主意。

    有很多问题可以解决这个问题,例如:“Is there a good method in C# for throwing an exception on a given thread.

    【讨论】:

      【解决方案5】:

      您可以添加一个设置布尔标志的取消按钮

      在循环内的关键点添加“Application.DoEvents”,然后检查布尔标志。如果标志已被触发,请执行清理并退出循环。

      【讨论】:

        【解决方案6】:

        BackgroundWorker 上的 WorkerSupportsCancellation 属性设置为 true :-)

        您还必须检查循环内的CancellationPending 属性,看看您是否应该中止处理。 chakrit 链接的 MSDN 文章有一个很好的示例代码块

        编辑:D'oh,你让我领先了几秒钟 chakrit :)

        【讨论】:

          猜你喜欢
          • 2018-05-22
          • 1970-01-01
          • 2015-08-29
          • 1970-01-01
          • 1970-01-01
          • 2021-11-16
          • 2023-03-11
          • 2015-07-22
          • 1970-01-01
          相关资源
          最近更新 更多