Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尽管使用了invoke,但关于跨线程调用的运行时错误_C#_Multithreading - Fatal编程技术网

C# 尽管使用了invoke,但关于跨线程调用的运行时错误

C# 尽管使用了invoke,但关于跨线程调用的运行时错误,c#,multithreading,C#,Multithreading,我在这一行代码中得到一个invalidoOperationException: SynchronizedInvoke(this, () => this.Opacity = this.Opacity + 0.05); 要具体说明运行时错误 跨线程操作无效:从创建控件“frmToaster”的线程以外的线程访问控件“frmToaster” 我使用了堆栈溢出中其他地方建议的SynchronizedInvoke方法,以确保在需要时使用调用 static void SynchronizedInvo

我在这一行代码中得到一个
invalidoOperationException

SynchronizedInvoke(this, () => this.Opacity = this.Opacity + 0.05);
要具体说明运行时错误

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

我使用了堆栈溢出中其他地方建议的
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
来避免跨线程调用,该代码如何生成运行时错误?

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

当sync.InvokeRequired为false时,您会得到该错误。那不好,应该是真的。在action()上设置断点;当你休息的时候,看看发生了什么

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

另一个简单的修复方法是不测试invokererequired,因为您在工作线程上运行它,所以您知道它应该总是正确的。使用BeginInvoke,而不是Invoke,在创建表单后UI线程重新进入消息循环之前,lambda不会运行。最终的解决方案是,使用winforms定时器,烧掉一个线程来淡出一个窗体是毫无意义的。为您节省一兆字节