2012-02-15 13 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:"); 

これは私ですスレッドセーフな方法でコードを取得しようとします。

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

あなたが使用することができるはずです。

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) 
関連する問題