从C#中不同于GUI线程的线程更改Rectangle Shape的颜色

时间:2014-08-25 12:52:47

标签: c# .net multithreading thread-safety

我需要从另一个线程更改Microsoft.VisualBasic.PowerPacks.RectangleShape的颜色,而不是创建它的那个线程。对于像按钮这样的其他控件,我正在执行以下操作:

if (button.InvokeRequired)
{
    button.Invoke((System.Action)(() =>
    {
        button.BackColor = Color.Red;
    }));
}
else
{
   button.BackColor = Color.Red;
}

问题InvokeRequiredInvoke不适用于RectangleShape

我该怎么办?

2 个答案:

答案 0 :(得分:2)

您可以使用RectangleShape的{​​{3}}属性:

if (shape.Parent.InvokeRequired)
{
    shape.Parent.Invoke((System.Action)(() =>
    {
        button.BackColor = Color.Red;
    }));
}
else
{
   button.BackColor = Color.Red;
}

答案 1 :(得分:2)

Shape将进入ShapeContainer,可以在shape.Parent属性中找到。所以你可以使用shape.Parent.InvokeRequired

同样遵循DRY原则:

var action = (System.Action)(() =>
{
    shape.BackColor = Color.Red;
};

if (shape.Parent.InvokeRequired)
{
    shape.Parent.Invoke(action);
}
else
{
   action();
}