从另一个线程更新UI这两种方法中哪一种更好? (对我来说,他们都工作,但哪个更安全?) 我更喜欢SetPropertyThreadSafe方法,因为它需要更少的代码。
1
label1.SetPropertyThreadSafe(() => this.label1.Text, "New Value");
2
if (label1.InvokeRequired)
{
label1.Invoke(new MethodInvoker(delegate {
label1.Text="New Value"; }));
}
答案 0 :(得分:5)
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”。