当前位置:  开发笔记 > 编程语言 > 正文

停止在winform按钮上执行的功能单击

如何解决《停止在winform按钮上执行的功能单击》经验,为你挑选了1个好方法。

你正在使用的事实Application.DoEvents是问题的第一个迹象:它表明你在UI线程中做得太多了.它几乎不适合结构良好的程序.UI线程并不意味着任何长时间运行的任务.(不可否认,如果绘制你的UI需要很长时间,你几乎没有选择 - 但这表明你应该简化你的UI ......在这种情况下它不适用,我怀疑.)

相反,您应该在单独的线程中执行长时间运行的任务(创建文件).BackgroundWorker非常适合这种情况 - 您可以使用它将进度报告回UI,并且UI可以调用CancelAsync方法来请求它停止.您需要CancellationPending从工作线程中检查属性,以查看是否已请求取消,并适当停止.

编辑:只是澄清我认为发生了什么 - 我怀疑你的表格正在关闭,但程序将不会终止,直到事件循环结束.你在文件创建循环中保持事件循环,因此问题.

请注意,按钮没有线程 - 只有一个用于整个UI.(在某些情况下,您可能需要多个UI线程,但这种情况很少见 - 如果您已经完成它,您就会知道它.)



1> Jon Skeet..:

你正在使用的事实Application.DoEvents是问题的第一个迹象:它表明你在UI线程中做得太多了.它几乎不适合结构良好的程序.UI线程并不意味着任何长时间运行的任务.(不可否认,如果绘制你的UI需要很长时间,你几乎没有选择 - 但这表明你应该简化你的UI ......在这种情况下它不适用,我怀疑.)

相反,您应该在单独的线程中执行长时间运行的任务(创建文件).BackgroundWorker非常适合这种情况 - 您可以使用它将进度报告回UI,并且UI可以调用CancelAsync方法来请求它停止.您需要CancellationPending从工作线程中检查属性,以查看是否已请求取消,并适当停止.

编辑:只是澄清我认为发生了什么 - 我怀疑你的表格正在关闭,但程序将不会终止,直到事件循环结束.你在文件创建循环中保持事件循环,因此问题.

请注意,按钮没有线程 - 只有一个用于整个UI.(在某些情况下,您可能需要多个UI线程,但这种情况很少见 - 如果您已经完成它,您就会知道它.)

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有