Capisco perché i controlli della GUI hanno affinità di thread.Perché i controlli WinForms/WPF non utilizzano Invoke internamente?
Ma perché i controlli non utilizzano la chiamata internamente nei propri metodi e proprietà?
Ora si hanno a che fare cose come questa solo per aggiornare TextBox
valore:
this.Invoke(new MethodInvoker(delegate()
{
textBox.Text = "newValue";
}
Mentre si utilizza solo textBox.Text = "newValue";
sarebbe sufficiente a rappresentare la stessa logica.
Tutto ciò che avrebbe dovuto essere fatto è cambiare textBox.Text
logica da questo (pseudocodice):
public string Text
{
set
{
if(!this.InvokeRequired)
// do the change logic
else
throw new BadThreadException();
}
}
A tal:
public string Text
{
set
{
if(!this.InvokeRequired)
// do the change logic
else
this.Invoke(new MethodInvoker(delegate()
{
// do the change logic
}
}
}
Lo stesso vale per getter e metodi.
sto certamente non proponendo di eliminare Invoke
/BeginInvoke
, sto solo chiedendo perché i controlli non si fanno se stessi passare il filo necessaria invece di buttare eccezione.
Poiché in genere non è necessario aggiornare i controlli su un thread diverso da quello in cui sono stati creati.Fare così è un caso eccezionale, quindi devi saltare attraverso i cerchi. Non ci sarebbe quasi nessun vantaggio ad avere questo built-in. –
Suppongo che ogni singolo "Invoke" implichi un sovraccarico, e se hai molti controlli che invocano automaticamente puoi incorrere in problemi di prestazioni. Lanciando l'escpetion, il sistema impone agli sviluppatori di occuparsi dei problemi di threading e di utilizzare il Dispatcher per effettuare una singola chiamata Invoke con tutte le assegnazioni all'interno. – BertuPG