你正在使用的事实Application.DoEvents
是问题的第一个迹象:它表明你在UI线程中做得太多了.它几乎不适合结构良好的程序.UI线程并不意味着任何长时间运行的任务.(不可否认,如果绘制你的UI需要很长时间,你几乎没有选择 - 但这表明你应该简化你的UI ......在这种情况下它不适用,我怀疑.)
相反,您应该在单独的线程中执行长时间运行的任务(创建文件).BackgroundWorker非常适合这种情况 - 您可以使用它将进度报告回UI,并且UI可以调用CancelAsync
方法来请求它停止.您需要CancellationPending
从工作线程中检查属性,以查看是否已请求取消,并适当停止.
编辑:只是澄清我认为发生了什么 - 我怀疑你的表格正在关闭,但程序将不会终止,直到事件循环结束.你在文件创建循环中保持事件循环,因此问题.
请注意,按钮没有线程 - 只有一个用于整个UI.(在某些情况下,您可能需要多个UI线程,但这种情况很少见 - 如果您已经完成它,您就会知道它.)
你正在使用的事实Application.DoEvents
是问题的第一个迹象:它表明你在UI线程中做得太多了.它几乎不适合结构良好的程序.UI线程并不意味着任何长时间运行的任务.(不可否认,如果绘制你的UI需要很长时间,你几乎没有选择 - 但这表明你应该简化你的UI ......在这种情况下它不适用,我怀疑.)
相反,您应该在单独的线程中执行长时间运行的任务(创建文件).BackgroundWorker非常适合这种情况 - 您可以使用它将进度报告回UI,并且UI可以调用CancelAsync
方法来请求它停止.您需要CancellationPending
从工作线程中检查属性,以查看是否已请求取消,并适当停止.
编辑:只是澄清我认为发生了什么 - 我怀疑你的表格正在关闭,但程序将不会终止,直到事件循环结束.你在文件创建循环中保持事件循环,因此问题.
请注意,按钮没有线程 - 只有一个用于整个UI.(在某些情况下,您可能需要多个UI线程,但这种情况很少见 - 如果您已经完成它,您就会知道它.)