Immagino che il vostro codice si riferisca a Windows Form.
Si chiama BeginInvoke
se è necessario eseguire qualcosa in modo asincrono nel thread dell'interfaccia utente: modificare le proprietà del controllo nella maggior parte dei casi.
In parole povere questo è possibile passare il delegato ad una procedura che viene eseguita periodicamente. (elaborazione del loop di messaggi e cose del genere)
Se BeginInvoke
è chiamato per il tipo Delegate
, il delegato viene richiamato in modo asincrono.
(Invoke
per la versione di sincronizzazione.)
Se vuoi codice più universale, che funziona perfettamente per WPF e WinForms si può considerare Task Parallel Library e l'esecuzione del Task
con il secondo context. (TaskScheduler.FromCurrentSynchronizationContext()
)
E per aggiungere un po 'di già detto da altri: lambda possono essere trattati sia come metodi anonimi o expressions.
E questo è il motivo per cui non puoi semplicemente usare var
con lambdas: il compilatore ha bisogno di un suggerimento.
UPDATE:
questo richiede .Net V4.0
// This line must be called in UI thread to get correct scheduler
var scheduler = System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext();
// this can be called anywhere
var task = new System.Threading.Tasks.Task(() => someformobj.listBox1.SelectedIndex = 0);
// also can be called anywhere. Task will be scheduled for execution.
// And *IF I'm not mistaken* can be (or even will be executed synchronously)
// if this call is made from GUI thread. (to be checked)
task.Start(scheduler);
Se hai iniziato l'attività da altro thread e la necessità di attendere per la sua completition task.Wait()
bloccherà chiamando filo fino la fine del compito.
Maggiori informazioni sulle attività here.
fonte
2013-01-17 21:15:13
tante domande diverse in un solo post ... - ci dovrebbero essere almeno 3 domande separate – Prokurors
Dai un'occhiata anche a questo articolo http://mark-dot-net.blogspot.com.uy/2014/07 /six-ways-to-initiate-tasks-on-another.html –