2012-02-15 47 views
4

我有以下代码,我一直在使用线程安全方式设置属性(改编自this other SO question,但我无法调整它以获取属性。Winforms - 以线程安全方式更新属性的最简单方法

这是线程安全的方式代码我一套物业

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:"); 

这是我的以线程安全方式代码尝试get属性。

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); 

回答

3

您应该能够使用:

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

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); 
    } 
} 

您可以通过以下称之为

相关问题