Abbiamo un'applicazione desktop che esegue un insieme di calcoli piuttosto rigoroso in un thread in background. Parti di questo calcolo vengono eseguite in una libreria non gestita a cui accediamo tramite l'interoperabilità. Quello che stiamo scoprendo è che, quando iniziamo il calcolo, il thread dell'interfaccia utente non risponde per la durata del calcolo. Avevamo l'impressione che il framework gestisse il cambio di thread per consentire all'interfaccia utente di continuare a rispondere, ma non è così. Abbiamo scoperto che possiamo inserire Thread.Sleep (0) o Application.DoEvents() per consentire all'interfaccia utente di rispondere. Questo ha l'effetto collaterale di rallentare il calcolo. Inoltre, porzioni del calcolo eseguite dal codice non gestito possono richiedere fino a 30 secondi per essere completate e durante questo periodo l'applicazione non risponde mai. L'intero calcolo può richiedere da due a cinque minuti per essere completato.Modello di threading .NET e Application.DoEvents vs. Thread.Sleep
Questo porta alle seguenti domande:
- Qual è il modello di threading .NET framework per quanto riguarda l'interfaccia utente e di interoperabilità?
- Siamo errati nell'assumere che il framework debba gestire il cambio di thread tra lo sfondo e i thread dell'interfaccia utente?
- Qual è la differenza tra l'uso di Thread.Sleep e Application.DoEvents in questa situazione, ed è uno preferito rispetto all'altro?
NOTA: molto vecchio Q & A; cerca nuove discussioni per ottenere buone risposte sulle soluzioni disponibili oggi. – ToolmakerSteve