Modifica: Sembra che devo riprendere ciò che ho scritto prima. Provato il seguente:
Aggiunto una casella di testo chiamato myTextBox
e ha cercato di recuperare il valore della proprietà Text
:
Thread t = new Thread(
o =>
{
Thread.Sleep(2000);
string value = myTextBox.Text;
Thread.Sleep(2000);
});
t.Start();
E sembra che l'applicazione (WPF) si blocca dopo 2 secondi. Utilizzando il dispatcher funziona:
Thread t = new Thread(
o =>
{
Thread.Sleep(2000);
myTextBox.Dispatcher.BeginInvoke(
(Action)(() => { string value = myTextBox.Text; }));
Thread.Sleep(2000);
});
t.Start();
Pertanto, è ancora necessario passare attraverso il filo dispatcher durante la lettura dei valori di componenti GUI, almeno in WPF.
Seconda modifica: Questo migliora. Apparentemente ripetere l'esperimento per il classico WinForms rivela che funziona per leggere la proprietà Text
senza utilizzare Invoke/BeginInvoke
. Abbastanza interessante, sembra che anche l'impostazione della proprietà funzioni bene (senza invocare), anche se scommetto che non è thread-safe e l'app non si lamenta per qualche motivo.
Bottom line: E 'una buona idea, in ogni caso di utilizzare il dispatcher quando interagisce con componenti GUI da altri thread, in quanto garantisce la lettura/scrittura sono serializzati ad un singolo thread e così non avete thread-sicurezza problemi.
è possibile utilizzare i delegati per farlo – jorne
@CodeCaster Solo provando e vedendo ciò che funziona generalmente non si ottiene codice thread-safe. – hvd
@hvd: Ma soddisfa tutte le domande poste _qui_. –