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

标签 c# winforms multithreading

  1. 在一个简单的 winform 应用程序中,我调用了一个函数,该函数在单击按钮事件时不断地创建文件。我将 Application.DoEvents() 添加到循环中。

  2. 我按红色 X 关闭表单。

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

我认为它在按钮线程上,但它不应该是背景线程吗?尝试在循环函数上将 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/

相关文章:

c# - ToolStripMenuItem ShowDropDown - 事件未触发

c# - 为什么我的线程完成后要花这么长时间才能退出?

c# - 为什么关闭嵌套的子对话框也会关闭父对话框?

ios - AmazonS3Client putObject 仅适用于 iOS 主线程?

c# - 多线程工作线程状态

c# - MVC 2 DropDownList 在 List 的情况下不选择值

用于 MS Word 公式编辑器的 C# API

multithreading - jsp如何保证线程安全?

c# - IList 是做什么用的?

C# 枚举和数据库表