2012-02-15 93 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); 
    } 
} 

您可以通過以下稱之爲