Domanda

Ho il problema che sto istanziando un oggetto sul thread dell'interfaccia utente (WinForms). La creazione di questo oggetto probabilmente richiede molto tempo e vorrei avere una sorta di "timeout" per quel metodo (perché sta bloccando la mia app).

I problemi che ho sono: 1. l'oggetto deve essere creato sul thread dell'interfaccia utente 2. l'oggetto è un oggetto estraneo e non ho alcun accesso all'origine, quindi non posso modificarlo.

Quindi la mia domanda sarebbe, se qualcuno ha un'idea creativa, se è possibile creare una logica che interrompe il metodo per essere eseguito se viene raggiunto un timeout?

tia Martin

È stato utile?

Soluzione

Ecco una cattiva soluzione. Utilizzare un thread di lavoro su un timer per monitorare il thread dell'interfaccia utente. Se il timer scade prima della creazione dell'oggetto, fai in modo che il thread di lavoro chiami Abort sul thread dell'interfaccia utente. Ciò genererà un ThreadAbortException nel thread dell'interfaccia utente che devi catturare. I motivi per cui questo è negativo è perché puoi causare il blocco o l'arresto anomalo del programma a seconda di tempistiche sottili e condizioni di gara per quando viene sollevata un'eccezione.

Un "più sicuro" il metodo prevede che l'operatore chiama Interrupt - ciò genererà un ThreadInterruptedException nel thread dell'interfaccia utente, ma solo quando si trova nello stato WaitSleepJoin - se il thread non dorme mai non si interromperà, ma almeno non si bloccherà né danneggerà neanche la memoria.

Altri suggerimenti

Non proprio; specialmente se non hai accesso alla fonte.

Anche se tu potessi, non è una buona idea interrompere forzatamente il codice senza una buona ragione: può solo portare a problemi (perdite, blocchi che vengono lasciati bloccati, ecc.)

Deve essere il stesso thread dell'interfaccia utente? Potresti generare un secondo thread dell'interfaccia utente per possedere questo codice? Diventa un po ' piccolo , ma può funzionare.

se stai usando BeginInvoke, IAsyncResult ha un handle di attesa sul quale è possibile WaitOne (timeout) - dal thread non UI.

Sfortunatamente, in timeout, non esiste un modo pulito per annullare BeginInvoke - quindi puoi provare la soluzione di 1800 INFORMATION .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top