C#SetPropertyThreadSafe vs调用线程安全调用

时间:2015-06-11 21:53:17

标签: c# .net multithreading backgroundworker invoke

从另一个线程更新UI这两种方法中哪一种更好? (对我来说,他们都工作,但哪个更安全?) 我更喜欢SetPropertyThreadSafe方法,因为它需要更少的代码。

1

label1.SetPropertyThreadSafe(() => this.label1.Text, "New Value");

2

if (label1.InvokeRequired)
{
   label1.Invoke(new MethodInvoker(delegate {
   label1.Text="New Value"; }));
}            

2 个答案:

答案 0 :(得分:5)

如果您使用this implmentation

SetPropertyThreadSafe不是.NET内置的方法

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

然后你发布的两个例子做的完全相同,所以没有区别。

答案 1 :(得分:1)

如果你前往

1

label1.SetPropertyThreadSafe(() => this.label1.Text, "New Value");
label2.SetPropertyThreadSafe(() => this.label1.Text, "New Value2");

和2.

if (label1.InvokeRequired)
{
   label1.Invoke(new MethodInvoker(delegate 
   {
   label1.Text="New Value"; 
   label2.Text="New Value2"; 
   }));
}    

然后(2)显然更好,因为它具有低得多的开销。但在你的情况下,他们之间没有任何选择。

如果您知道自己在另一个线程上,则不需要“if InvokeRequired”。