Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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# 更改窗体背景色时,在不同控件上获取跨线程无效操作_C#_Multithreading_Winforms - Fatal编程技术网

C# 更改窗体背景色时,在不同控件上获取跨线程无效操作

C# 更改窗体背景色时,在不同控件上获取跨线程无效操作,c#,multithreading,winforms,C#,Multithreading,Winforms,当数据库连接丢失时,我正在更改winforms背面颜色。我是通过一名代表这样做的: private void SetOfflineBackColor(Color color) { if (InvokeRequired) { SetOfflineBackground d = SetOfflineBackColor; Invoke(d,BackColor = color ); }

当数据库连接丢失时,我正在更改winforms背面颜色。我是通过一名代表这样做的:

    private void SetOfflineBackColor(Color color)
    {
        if (InvokeRequired)
        {
            SetOfflineBackground d = SetOfflineBackColor;

            Invoke(d,BackColor = color );
        }
        else
        {

            BackColor = DefaultBackColor;
        }
    }
而且效果很好。然而,还有另一个控件,textbox,当我调用invoke时,它现在抛出了一个跨线程错误。我不明白为什么这个文本框会包含在调用中。
有没有办法深入了解原因,或者我只是在调用中遗漏了什么?

看起来您的调用调用中有一个赋值。试着改变

Invoke(d,BackColor = color );


因为您在不需要调用时忽略了color参数。

看起来您的调用中有一个赋值。试着改变

Invoke(d,BackColor = color );


因为您在不需要调用时忽略了颜色参数。

您可以使用此模式,它更具可读性:

private void SetOfflineBackColor(Color color)
{
    // if method is called from another thread, it will be enqued to the dispatcher
    if (InvokeRequired) {
        Action<Color> action = SetOfflineBackground;
        Invoke(action, color);
        return;
    }

    // now you can continue as usual
    BackColor = color;
}

问题是分配到
BackColor
属性的赋值仍然在非UI线程中。

您可以使用此模式,它更具可读性:

private void SetOfflineBackColor(Color color)
{
    // if method is called from another thread, it will be enqued to the dispatcher
    if (InvokeRequired) {
        Action<Color> action = SetOfflineBackground;
        Invoke(action, color);
        return;
    }

    // now you can continue as usual
    BackColor = color;
}

问题是分配到
BackColor
属性的赋值仍然在非UI线程中。

我尝试了这个,但是BackColor一点也没有改变。我尝试了这个,但是BackColor一点也没有改变。这个方法有效,但是我不能在调用中直接使用SetOfflineBackground,我必须创建委托变量。只有一个FYIThis可以工作,但是我不能在调用中直接使用SetOfflineBackground,我必须创建委托变量。仅供参考
var rslt = BackColor = color;
Invoke(d, rslt);