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"。
这两种方法中哪一种更适合从另一个线程更新 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"。