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