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

gil*_*gil 2 c# multithreading winforms

  1. 在一个简单的winform应用程序中,我调用一个函数,在按钮单击事件上无限创建文件.我将Application.DoEvents()添加到循环中.

  2. 我按下红色X关闭表格.

  3. 表单关闭,但文件继续创建...

我认为它在按钮线程上,但它不应该是一个背景吗?尝试在循环函数上将Thread.CurrentThread.IsBackGround更改为True无济于事.

想法?

Jon*_*eet 5

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

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

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

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