代码之家  ›  专栏  ›  技术社区  ›  Alex

C#我怎样才能让另一个子程序休息?

  •  8
  • Alex  · 技术社区  · 17 年前

    我有一个循环正在运行,它将处理1000条记录,目前循环一旦运行就无法停止,用户必须等待它完成。当有人单击“取消”按钮时,如何停止循环?我该如何打破另一个惯例?

    谢谢

    6 回复  |  直到 17 年前
        1
  •  13
  •   Mark S. Rasmussen    17 年前

    您可以在自己的线程中运行它,然后中止该线程。只是要小心,这可能会使操作处于不好的状态。

    相反,你 应该 创建线程在安全点检查的退出标志。如果标记为退出,线程将在安全的情况下立即停止。

        2
  •  13
  •   chakrit Dutchie432    17 年前

    你可以用 BackgroundWorker 组成部分

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

    它有很好的支持 取消信号 以及 进度报告

    还有很多可以在谷歌上查找的代码示例。


    设定 WorkerSupportsCancellation 所以这是真的。

    backgroundworker1.WorkerSupportsCancellation = true;
    

    去做吧 在你开始之前 工人。

    然后,在循环中,您可以对 CancellationPending 财产:

    if (backgroundWorker1.CancellationPending) return;
    

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

        3
  •  1
  •   Patrick D'Souza ob1    13 年前

    谢谢你的回复。这是一个 backgroundworker 但当我使用 backgroundworker1.cancelAsync(); 我有个例外:

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

    我该如何改变这一点?这是继承的代码,抱歉!

        4
  •  0
  •   Community Mohan Dere    9 年前

    正如Mark所说,您需要实现某种合作同步。人们往往倾向于使用线。在这里中止。。。但这是个坏主意。

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

        5
  •  0
  •   wusher    17 年前

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

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

        6
  •  0
  •   Patrick D'Souza ob1    13 年前

    设定 WorkerSupportsCancellation 你的财产 BackgroundWorker 为真:-)

    你还得检查一下 CancellationPending 属性,以查看是否应该中止处理。chakrit链接的MSDN文章有一段很好的示例代码

    编辑:哦,你几秒钟就把我抓住了,查克里特:)