【问题标题】:Cancel Main Form closing while some thread runs in back, C# .windows application?C# .windows 应用程序在某些线程运行时取消主窗体关闭?
【发布时间】:2012-03-09 06:42:57
【问题描述】:

我正在运行一个后台线程来移动 Windows 应用程序中的一些配置文件数据。该线程将在一定的时间间隔内定期运行。

如果用户试图在线程运行时关闭表单,我应该提示用户线程正在运行并且不应该允许用户关闭表单。一旦它的(线程)完成,那么只有我需要关闭表单。

如果我在“Form_Closing”事件中执行此操作,线程将停止(当我调试时)并且控件 留在表单本身。关闭表单后,线程恢复..,不确定有什么问题。

我该如何有效地处理这个问题?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    Closing 事件中,您可以使用Cancel 属性:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
            if (backgroundWorker1.IsBusy) {
                MessageBox.Show("Thread busy!");
                e.Cancel = true;
            }
        }
    

    【讨论】:

    • 虽然这个解决方案会阻止他的表单关闭,但是如果线程在下次用户尝试关闭表单时再次唤醒,这对最终用户来说可能非常烦人。增强功能应该是在线程完成后自动关闭表单或向线程发送一个标志以指示它不应再执行其周期性任务(毕竟用户确实想退出)。
    【解决方案2】:

    如果您在表单中引用了线程,您可以在 OnFormClosing 事件中检查其IsAlive 属性。如果为真,则防止表单关闭e.Cancel = !Thread.IsAlive

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多