Winforms - 以线程安全方式更新属性的最简单方法是什么

时间:2012-02-15 17:52:17

标签: c# winforms multithreading user-interface

我有以下代码用于以线程安全的方式设置属性(改编自this other SO question,但我无法调整它以获取属性。

这是我在线程安全方式代码中的set属性。

public static void SetPropertyThreadSafe(this TControl self, Action setter)
    where TControl : Control
{
    if (self.InvokeRequired)
    {
        var invoker = (Action)(() => setter(self));
        self.Invoke(invoker);
    }
    else
    {
        setter(self);
    }
}

通过执行以下操作来调用:

this.lblNameField.SetPropertyThreadSafe(p => p.Text = "Name:");

这是我尝试使用线程安全方式代码获取属性。

public static TResult GetPropertyThreadSafe(this TControl self, Func getter)
    where TControl : Control
{
    if (self.InvokeRequired)
    {
        var invoker = (Func)((TControl control) => getter(self));
        return (TResult)self.Invoke(invoker);
    }
    else
    {
        return getter(self);
    }
}

它不起作用。我希望通过以下方式来称呼它:

string name = this.lblNameField.GetPropertyThreadSafe(p => p.Text);

1 个答案:

答案 0 :(得分:3)

你应该可以使用:

public static TResult GetPropertyThreadSafe<TControl, TResult>(this TControl self, Func<TControl, TResult> getter)
    where TControl: Control
{
    if (self.InvokeRequired)
    {
        return (TResult)self.Invoke(getter, self);
    }
    else
    {
        return getter(self);
    }
}

您可以通过以下方式调用它:

bool visible = this.lblNameField.GetPropertyThreadSafe(p => p.Visible)