2010-05-08 12 views
5

Per far apparire una finestra di messaggio, sto usando MessageBox.Show(...). Io di solito avvolgere la chiamata in un Invoke:Devo invocare chiamate MessageBox?

BeginInvoke (new Action (() => { 
    MessageBox.Show()); 
})); 

(ho rimosso una parte della domanda originale, che è stato risposto elsewhere)

faccio sempre bisogno di avvolgere la chiamata MessageBox in un (Begin-) Invoke se sto chiamando da un thread non GUI?

+0

ho aggiunto una nuova domanda sulla questione 2. (http://stackoverflow.com/questions/2819146/what-is-the-difference-between-invoking-and-begininvoking-a-messagebox) – mafu

risposta

1

Risposta breve: sì, perché lo considererei una buona pratica. risposta

più lunga:

Non si dovrebbe entrare in una situazione in cui si deve porsi questa domanda, almeno non nel lungo periodo. Di solito, in un software ben progettato, hai definito "gateway" tra l'interfaccia utente e il "resto del mondo", questo sarebbe anche il luogo in cui si generano gli eventi che notificano alla GUI che qualcosa deve essere fatto (tramite BeginInvoke (EventRaiserMethod (params))).

+0

Da un punto di progettazione di vista, suona molto ragionevole e sono d'accordo. Tuttavia, sono interessato anche alle risposte effettive. – mafu

+0

Mi spiace non avere risposte migliori, hm ... ma direi che la tua prima domanda (sulla necessità) è principalmente una questione di stile e interpretazione. La domanda è: vuoi mettere la domanda sulla sicurezza dei thread nelle mani di Microsofts? Sai se in realtà hanno quel modello "Invoke" - wrapper nel loro metodo "MessageBox.Show (...)" -? Cosa succede se lo fanno e cambiano più tardi? Riguardo alla seconda domanda: sono un po 'stupito che non faccia alcuna differenza. Proverò più tardi me stesso, questo sembra molto interessante. – stormianrootsolver

+0

Informazioni su 2): MessageBoxes ha il proprio messaggio pump, credo che sia responsabile. – mafu

0
  1. Per quanto ne so, fino a quando si Non tiratevi fornire il parametro titolare nella chiamata a MessageBox.Show Non devi invocare la chiamata sul thread dell'interfaccia utente.
    Cioè, se si fornisce il parametro proprietario è necessario richiamare la chiamata a MessageBox.Show sul battistrada su cui è stato creato il proprietario.
    - Si prega di correggere se sto male-
  2. Dipende se si vuole avere il thread UI continuare l'esecuzione o se lo vuoi bloccato mentre mostra il msgbox.