2015-12-09 8 views
5

che ho in un clic sul pulsante in questo modo:Perché la clessidra (WaitCursor) smette di ruotare? Codice

try 
{ 
    Cursor = Cursors.WaitCursor; 
    GenerateReports(); 
} 
finally 
{ 
    Cursor = Cursors.Default; 
    GC.Collect(); 
    GenPacketBtn.Enabled = true; 
} 

In nessun altro luogo, ma nel blocco finally è il cursore arretrato per impostazione predefinita, ma lo fa "si stanca" e tornare al suo stato di default per qualche ragione. Perché dovrebbe essere così, e come posso assicurare che non si fermerà "in attesa" fino a quando il grande papà di tutti i processi (GenerateReports()) non sarà completato?

+1

IsRate di generazione asincrona? –

+0

No, non ho codice asynch. –

+0

Non c'è alcun motivo per cui "smetterebbe di aspettare" per completare GenerateReports(). Possiamo vedere cosa c'è in quella funzione? –

risposta

3

Utilizzare invece Control.UseWaitCursor = true, non è scaduto.

Se un'operazione costosa viene eseguita, Windows subentrerà e cambierà lo Cursor.WaitCursor in qualsiasi cosa ritenga necessario. Quindi con Cursor.WaitCursor sarà a causa di un timeout (ma non del tutto sicuro su questo) o perché Windows si limita a rivendicare la proprietà del cursore senza riguardo al suo stato precedente. Abbiamo anche avuto una situazione simile in cui il Cursore non si comportava come previsto durante l'esecuzione di un'operazione costosa che coinvolgeva i convertitori PDF di terze parti, ma non abbiamo analizzato più la natura del problema in quanto non era una priorità.

Dopo un po 'di lettura, si è scoperto mettendo il cursore clessidra è un po' più complicato di quanto sembri:

.net WaitCursor: how hard can it be to show an hourglass?

anche come nota a margine: si consiglia di utilizzare Cursor.Current = Cursors.WaitCursor come questo costringe il cursore per passare a occupato immediatamente, maggiori dettagli a: https://stackoverflow.com/a/302865/1463733

Problemi correlati