【问题标题】:Cross Thread error disposing form with Timer使用 Timer 处理跨线程错误表单
【发布时间】:2012-01-22 04:12:21
【问题描述】:

我在我的一个窗体上设置了一个 10 秒的计时器。对于 OnTimedEvent,我设置了在时间结束后处理表单。但是似乎有一个错误

用户代码未处理 InvalidOperationException。

跨线程操作无效:控件“notificationForm”从创建它的线程以外的线程访问。

错误就行了

protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

我的计时器事件的代码是

    private void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        this.Dispose();
    }

有人知道如何解决这个问题吗?谢谢!

【问题讨论】:

    标签: c# winforms exception error-handling


    【解决方案1】:

    您似乎正在使用System.Timers.Timer

    尝试改用System.Windows.Forms.Timer 并订阅Tick 事件。

    如果您必须使用该计时器,您可以尝试将代码更改为:

    private void OnTimedEvent(object source, ElapsedEventArgs e)
    {
       this.BeginInvoke((MethodInvoker)delegate { this.Dispose(); });
    }
    

    【讨论】:

    • 嗨。谢谢您的回复。只是想知道,system.windows.form.timer 与普通计时器有什么区别?
    • Timers.Timer 是一个基于服务器的计时器,这就是为什么它与表单位于不同线程上的原因。 windows 计时器与 GUI 运行在同一线程上——这就是为什么对于 winforms 应用程序来说,它通常是更合适的计时器。 ToolBox 中的计时器是 Forms.Timer。
    【解决方案2】:

    或者只是:

    this.Invoke((Action)(() => { this.Dispose(); }));
    

    你可以在一行中做到这一点:

    timer1.Tick += (_, __) => { this.Invoke((Action)(() => { this.Dispose(); })); };
    

    【讨论】:

      【解决方案3】:

      正如其他人所说,问题在于您的计时器正在运行一个线程并试图处理在另一个线程上创建的对象。您需要在表单尝试访问它之前调用 dispose 方法。

      需要注意的基本事项,如果您尝试从另一个线程更改设计器中创建的表示对象,您需要检查是否需要调用。

      void OnTick()
      {
          if (InvokeRequired)
              Invoke(new MethodInvoker(OnTick));
          else
          {
              Dispose();
          }
      }
      

      【讨论】:

        【解决方案4】:
        private void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            this.Invoke(new Action(() => this.Dispose()));
        }
        

        按原样工作

        【讨论】:

          猜你喜欢
          • 2010-10-02
          • 2014-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多