Winforms - 如何以最简单的方式线程安全地更新属性

4
我有以下代码,可以以线程安全的方式设置属性(改编自这个SO问题),但我不能适应它来获取属性。
这是我线程安全的设置属性的代码。
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个回答

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接