尽管使用了调用,但有关跨线程调用的运行时错误

时间:2010-11-05 20:02:33

标签: c# multithreading

我在这行代码上得到InvalidOperationException

SynchronizedInvoke(this, () => this.Opacity = this.Opacity + 0.05);

具体说明运行时错误......

  

跨线程操作无效:控制从其创建的线程以外的线程访问的“frmToaster”。

我使用了Stack Overflow上其他地方建议的SynchronizedInvoke方法,以确保在需要时使用调用。

static void SynchronizedInvoke(ISynchronizeInvoke sync, Action action)
{
    // If the invoke is not required, then invoke here and get out.
    if (!sync.InvokeRequired)
    {
        // Execute action.
        action();

        // Get out.
        return;
    }

    // Marshal to the required thread.
    sync.Invoke(action, new object[] { });
}

即使我使用SynchronizeInvoke来避免它,此代码如何生成有关跨线程调用的运行时错误?

2 个答案:

答案 0 :(得分:2)

当sync.InvokeRequired为false时,你会得到它。这不好,应该是真的。在action()上设置断点;并了解休息时发生的事情。

这是在显示表单时使用的代码类型,当尚未创建表单的句柄时,InvokeRequired为false。确保此代码不会太快运行,您必须等到表单的OnHandleCreated()方法运行或Load事件触发,以更容易覆盖为准。

另一个简单的解决方法是不测试InvokeRequired,你知道它应该始终为true,因为你在工作线程上运行它。使用BeginInvoke,而不是Invoke,并且在UI线程重新进入消息循环之前,lambda将不会运行,创建表单之后。最终修复,没有点燃烧线程只是为了淡化表格,使用winforms计时器。节省一兆字节。

答案 1 :(得分:-1)

我不认为lambda表达式是线程安全的