Ciao!
>Allora ragazzi. Nella mia applicazione (c# e windows form con
>Visual Studio 2008) ho necessita in thread che prima che venga
>eseguita un'istruzione si aspetti un po (qualche secondo)
>Non posso usare uno sleep perchè in questo modo viene addormentata
>l'applicazione ... e proprio questo io devo evitare.
>Riassumendo:
>
>istruzione a
>---
>..
>istruzione b
>
>Tra l'istruzione a e l'istruzione b io devo attendere qualche
>secondo perchè si possono verificare delle condizioni e quindi
>cambiare alcune variabili che mi serivranno per il proseguo e
>che sono determinanti per l'istruzione b.
>Cosa suggerite???
Scusami ma, potresti spiegare meglio la situazione?Ovvero hai parlato di thread, parli del thread principale o ne lanci uno parallelo?Queste condizioni che possono verificarsi vengono create in questo thread "parallelo" o sono condizioni esterne al programma?
Non potresti invece gestire tutto con un'evento?Ovvero :
1)Sottoscrivi un nuovo gestore evento
2)fai partire il "metodo2" (che contiene praticamente le "condizioni" da verificare) alla fine del metodo scateni l'evento sottoscritto e nel suo gestore completi le operazioni.
Se parli invece di thread differenti lanciati da te e sei SICURO del loro comportamento puoi semplicemente "mettere in pausa" il thread principale e "riattivarlo" dal thread secondario :
private void button2_Click(object sender, RoutedEventArgs e)
{
//...
//Tue istruzioni....
//...
//Creo il nuovo thread
Thread t = new Thread(RoutineThread2);
//Lo faccio partire impostando
//come parametro il thread corrente
t.Start(Thread.CurrentThread);
//Sospendo il thread corrente
Thread.CurrentThread.Suspend();
}
private void RoutineThread2(object o)
{
for (int i = 0; i < 100; i++)
{
//Se siamo al terzo ciclo, riattiva
//il thread principale
if (i == 3)
{
((Thread)o).Resume();
Thread.CurrentThread.Abort();
}
MessageBox.Show("cccc");
}
}
Quest'ultima idea l'ho buttata giu molto velocemente ma a mio parere (e non solo) non è una pratica corretta, questa gestione puo causare parecchi problemi riguardanti la concorrenza sulle risorse e perciò è da evitare a meno che, ripeto, non conosci a fondo il comportamento dei thread e sei sicuro delle loro operazioni, evitando ogni tipo di Exception la cosa migliora, resta comunque il fatto che se mi parli di mettere in pausa e riattivare non hai molte vie d'uscita...ovviamente potresti usare altro genere di classi per la gestione/sincronizzazioni dei thread (Mutex, semaphore etc...) per ottenere una "corretta gestione" ma il succo della questione rimane inviariato.
Ricorda che la creazione, il blocco, la sospensione o la riattivazioni di thread sono pratica da utilizzare con cautela e con i giusti strumenti e accorgimenti,spero che analizzando per bene la cosa potrai cavartela con qualche evento o giu di li ;)
Queste sono solo delle idee, ma se ci spieghi meglio (e magari posti un po di codice) si trovano sicuramente soluzioni piu adatte e/o migliori!
>grazie mille
Di nulla ;) Fammi sapere!
------------------------------------------
Ignazio Catanzaro
http://blogs.dotnethell.it/swdev/