【问题标题】:How to enable form button after process has exited?进程退出后如何启用表单按钮?
【发布时间】:2011-01-05 06:06:59
【问题描述】:

我有一个使用 C# 开发的 Windows 应用程序。在这个应用程序中,我正在创建一个进程。 我想在 Process_Exited() 事件发生时启用和禁用几个按钮。 在 Process_Exited() 方法中,我编写了启用按钮的代码,但在运行时我收到错误

"跨线程操作无效: 控制 'tabPage_buttonStartExtraction' 从线程以外的线程访问 创建它的线程。”

我的代码 sn-p 是:

 void rinxProcess_Exited(object sender, EventArgs e)
 {
     tabPage_buttonStartExtraction.Enabled = true;
     tabPageExtraction_StopExtractionBtn.Enabled = false;
 }

谁能建议如何使这成为可能?

【问题讨论】:

    标签: c# .net winforms multithreading process


    【解决方案1】:

    将启用/禁用行移到单独的方法中,并使用 Control.Invoke 方法从 rinxProcess_Exited 调用该方法。

    【讨论】:

      【解决方案2】:

      您正在尝试从不同的线程更改 UI。 试试这样的;

          private void SetText(string text)
          {
              // InvokeRequired required compares the thread ID of the
              // calling thread to the thread ID of the creating thread.
              // If these threads are different, it returns true.
              if (this.textBox1.InvokeRequired)
              {   
                  SetTextCallback d = new SetTextCallback(SetText);
                  this.Invoke(d, new object[] { text });
              }
              else
              {
                  this.textBox1.Text = text;
              }
          }
      

      您不应该从另一个线程对 UI 做太多工作,因为调用非常昂贵。

      来源:http://msdn.microsoft.com/en-us/library/ms171728.aspx

      【讨论】:

        【解决方案3】:

        您必须在 UI 线程上进行 UI 更改。详情请见this question

        这是应用于您的示例的解决方案:

        void rinxProcess_Exited(object sender, EventArgs e)
        {
            if (this.InvokeRequired)
            {
                this.Invoke((Action)(() => ProcessExited()));
                return;
            }
        
            ProcessExited();
        }
        
        private void ProcessExited()
        {
            tabPage_buttonStartExtraction.Enabled = true;
            tabPageExtraction_StopExtractionBtn.Enabled = false;
        }
        

        【讨论】:

        • 它可以在 .net 2.0 框架上运行吗?我认为 => 运算符是在 3.5 框架中添加的
        • 你是对的。如果您使用的是 2.0 框架,则必须使用委托而不是匿名方法。我只是假设 3.5 或更高。
        猜你喜欢
        • 2012-04-26
        • 1970-01-01
        • 2013-03-29
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多