2012-06-08 9 views
5

Quando sto invocando un certo numero di metodi a un Dispatcher, dicono che il Dispatcher del thread UI,Esecuzione di metodi in modo asincrono invocati

come qui

uiDispatcher.BeginInvoke(new Action(insert_), DispatcherPriority.Normal); 
uiDispatcher.BeginInvoke(new Action(add_), DispatcherPriority.Normal); 
uiDispatcher.BeginInvoke(new Action(insert_), DispatcherPriority.Normal); 

saranno questi metodi saranno eseguiti nello stesso ordine come li ho invocati?

+9

In generale, quando si scrive codice asincrono, il codice dovrebbe essere scritto in modo tale che l'ordine di invocazione * non ha importanza. * –

risposta

11

Con Dispatcher, questi verranno sempre eseguiti nello stesso ordine in cui sono stati chiamati, ma solo perché lo DispatcherPriority è lo stesso. Questo comportamento è garantito e documentato in Dispatcher.BeginInvoke:

Se le chiamate BeginInvoke multipli sono realizzati nello stesso DispatcherPriority, saranno eseguiti nell'ordine le chiamate sono state fatte.

Detto questo, con operazioni asincrone, in genere è meglio non fare affidamento su questo comportamento. Non devi pianificare le cose che vengono eseguite in un ordine specifico se le stai chiamando come operazioni asincrone. Ciò crea efficacemente Coupling tra le operazioni asincrone e l'implementazione dello scheduler.

Se l'ordine è importante, in genere è meglio rielaborare il progetto in un modo che lo garantisca, anche se il meccanismo di pianificazione dovesse cambiare. Ciò è molto più semplice utilizzando TPL, ad esempio, poiché è possibile pianificare le operazioni e quindi pianificare le operazioni successive come continuazioni della prima attività.

+3

cancellato la mia risposta perché era * errato * a causa della mia qualcosa che manca importante. Questa è la risposta corretta. –

+0

@Reed Copsey È molto utile sapere che posso sfruttare questo particolare comportamento dell'oggetto Dispatcher quando ha senso. Non essere in grado di fare affidamento sull'ordine delle esecuzioni delle operazioni asincrone è una situazione molto soddisfacente dal momento che si deve sempre occuparsi dell'ordinamento della propria operazione da soli invece di affidarsi a qualche meccanismo di esecuzione imprevedibile in background. Grazie mille per la tua risposta! –

5

Da MSDN

Se più chiamate BeginInvoke sono realizzati nello stesso DispatcherPriority, saranno eseguiti nell'ordine le chiamate sono state fatte.

+0

L'ho supervisionato mentre esaminavo la documentazione :) Grazie mille per la risposta. –

Problemi correlati