在一个简单的 winform 应用程序中,我调用了一个函数,该函数在单击按钮事件时不断地创建文件。我将 Application.DoEvents() 添加到循环中。
我按红色 X 关闭表单。
表单关闭,但文件继续创建......
我认为它在按钮线程上,但它不应该是背景线程吗?尝试在循环函数上将 Thread.CurrentThread.IsBackGround 更改为 True 没有帮助。
想法?
最佳答案
您正在使用 Application.DoEvents
这一事实是出现问题的第一个迹象:它表明您在 UI 线程中做的事情太多了。它几乎不适合结构良好的程序。 UI 线程并不意味着有任何长时间运行的任务。 (诚然,如果绘制 UI 需要很长时间,您别无选择 - 但这表明您应该简化 UI ......我怀疑它不适用于这种情况。)
相反,您应该在单独的线程中执行长时间运行的任务(创建文件)。 BackgroundWorker非常适合这个——您可以使用它向 UI 报告进度,并且 UI 可以调用 CancelAsync
请求它停止的方法。您需要检查 CancellationPending
来自工作线程内的属性,以查看是否已请求取消,并适本地停止。
编辑:只是为了澄清我认为正在发生的事情——我怀疑你的表单正在关闭,但程序在事件循环完成之前不会终止。您让事件循环与您的文件创建循环一起进行,因此出现了问题。
请注意,按钮没有线程 - 整个 UI 只有一个线程。 (在某些情况下,您可能需要多个 UI 线程,但这种情况很少见 - 如果您这样做了就会知道。)
关于c# - 停止在 winform 按钮上执行的功能单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/259676/