2015-06-11 5 views
0

Какой из этих двух методов лучше обновлять пользовательский интерфейс из другого потока? (для меня они работают, но безопаснее?) Я бы предпочел метод SetPropertyThreadSafe, так как ему нужно меньше кода.C# SetPropertyThreadSafe vs Invoke потокобезопасные вызовы

1.

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

2.

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

определить * лучше * ... в противном случае это просто мнение основано ... –

+0

Разве это не просто метод расширения для вызова вызова? Они имеют одинаковый уровень «безопасности» – Levesque

+1

Они делают то же самое, поэтому вы должны использовать 1-й, потому что это более красиво. Мы хотим, чтобы наш код был хорош, не так ли? :) – voytek

ответ

5

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

Если вы голову

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».

+0

вы не можете обновить label2 с помощью теста invoke только для label1 –

+0

@MarioM, вы можете, если знаете, что оба они работают в одном и том же окне верхнего уровня, так как WPF и WinForms ТОЛЬКО поддерживают одну очередь сообщений в окне верхнего уровня, поэтому может ТОЛЬКО быть 1 UI-нитью в окне верхнего уровня. –

+0

ОЧЕНЬ трудно получить больше одной очереди сообщений в процессе, даже когда вы пытаетесь! –