2012-06-14 8 views
5

Uso VS2010 e C# per creare un'applicazione desktop. Questa applicazione ha un modulo con un compito enorme che richiede molto tempo per essere completato. Quando questo modulo viene inizializzato funziona perfettamente, tranne che mostra “Non risponde” sulla barra del titolo, come l'immagine mostra:Come impedire un messaggio di mancata risposta sulla barra del titolo di una finestra?

enter image description here

Dopo aver completato tutte le operazioni, mostra l'output desiderato. Perché viene visualizzato questo messaggio e come posso impedirlo?

+0

Ho upvoted perché questa è una domanda legittima per qualcuno che non ha molta esperienza. – siride

risposta

4

È necessario utilizzare un oggetto BackgroundWorker in modo che l'attività dispendiosa venga eseguita in un thread separato in modo asincrono. Ciò consentirà a Windows il multitasking di rendere l'interfaccia utente reattiva. Dovresti usare un cursore di attesa o qualche altro indicatore visivo per far sapere all'utente che la tua applicazione è occupata.

Da MSDN MSDN BackgroundWorker

La classe BackgroundWorker consente di eseguire un'operazione su un thread separato, dedicato. Operazioni che richiedono molto tempo come download e transazioni di database possono far sembrare l'interfaccia utente (UI) come se avesse smesso di rispondere mentre erano in esecuzione. Quando si desidera un'interfaccia utente reattiva e si riscontrano lunghi ritardi associati a tali operazioni, la classe BackgroundWorker fornisce una soluzione conveniente.

Per eseguire un'operazione che richiede molto tempo in background, creare un BackgroundWorker e ascoltare gli eventi che segnalano lo stato della propria operazione e segnalare quando l'operazione è terminata. È possibile creare BackgroundWorker in modo programmatico o trascinarlo nel modulo dalla scheda Componenti della Casella degli strumenti. Se si crea il BackgroundWorker nella Progettazione Windows Form, questo verrà visualizzato nel Vassoio del componente e le sue proprietà verranno visualizzate nella finestra Proprietà.

Per impostare un'operazione in background, aggiungere un gestore di eventi per l'evento DoWork. Chiama l'operazione che richiede tempo in questo gestore di eventi. Per avviare l'operazione, chiama RunWorkerAsync. Per ricevere notifiche sugli aggiornamenti di avanzamento, gestisci l'evento ProgressChanged. Per ricevere una notifica quando l'operazione è completata, gestire l'evento RunWorkerCompleted.

1

È necessario eseguire l'enorme attività su un thread in background in modo da non bloccare il thread dell'interfaccia utente (principale).

+0

BlackSpy, grazie per la risposta, non capisco queste righe "blocca il thread dell'interfaccia utente (principale)", la prego di dirlo in dettaglio. – shamim

+1

Suggerirei di fare qualche ricerca sulla classe di Backgroundworker e di eseguire i tuoi processi lì. Ciò impedirà il congelamento dell'interfaccia utente durante l'attesa per il completamento dell'operazione a esecuzione prolungata. Ciò è dovuto al fatto che il "lavoro" viene eseguito su un thread diverso rispetto all'interfaccia utente, pertanto gli eventi dell'interfaccia utente (pittura, aggiornamento, ecc.) Non vengono bloccati. – tsells

Problemi correlati