C# SetPropertyThreadSafe 与 Invoke 线程安全调用

C# SetPropertyThreadSafe vs Invoke thread-safe calls

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

1.

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

2.

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

SetPropertyThreadSafe 不是 .NET 内置的方法,如果您使用 this implmentation

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.

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"。