【问题标题】:Fixing a Cross-Thread Exception修复跨线程异常
【发布时间】:2011-10-27 17:13:13
【问题描述】:

我需要一些帮助来修复跨线程异常。我正在使用通常可以解决此问题的 Invoke,但由于某种原因它无法正常工作:

void paintTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    Invoke(new InvalidateFromSepThreadDel(InvalidateFromSepThread));
}
delegate void InvalidateFromSepThreadDel();
void InvalidateFromSepThread()
{
    TailGraph.Invalidate();
}

Invoke 上抛出异常:

$exception {"跨线程操作无效:控件'XTailGraph' 从创建它的线程以外的线程访问 on."} System.Exception {System.InvalidOperationException}

【问题讨论】:

  • 试试 TailGraph.Invoke(new InvalidateFromSepThreadDel(()=>TailGraph.Invalidate()));
  • 这不应该产生那个异常,支持从另一个线程调用 Control.Invalidate()。通过 Windows 和 Winforms。确保您实际上没有调用 Invalidate(true)。

标签: c# .net multithreading exception


【解决方案1】:

Invoke 将封送回线程该控件(正在使用调用方法的那个)是在其上创建的。确保其他控件也在所述线程上创建——也就是说,确保一开始没有在“错误线程”上创建一个控件。 p>

此外,由于没有为Invoke 指定目标,因此它将是包含对象/类的this.Invoke——这可能不合适。

(或者正如 Hasan Khan 指出的那样,考虑 WinForms 计时器......在这种情况下,回调将始终在创建计时器的线程中运行。)

编码愉快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多