Appel synchrone bloquant (code TRES simplifié)

Résolu
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010 - 14 janv. 2008 à 05:10
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010 - 15 janv. 2008 à 02:19
Bonjour !
J'ai un petit souci sur les appels synchrones en C#
Je vais simplifier le probleme :

Dans un thread j'éxécute mon code général qui ressemble à ca :



do
{
   while
(trucs.Count > 0)
//trucs est un container qui contient des trucs

   {

      Truct = /*on recupere un element de trucs*/;
      
      my_thread_pool.Add(t, newSuccessNotifierDelegate(delegate(TrucAnalyse analyse_de_truc, bool success)
      {
         // en fonciton de analyse_de_truc, on ajoute potentiellement de nouveaux element dans "trucs"  
      }
   }
   Thread.Sleep(20); // Dort 20 ms dans le caso u il n'y a que des traitement a faire
//On peut n'avoir aucun truc dans "trucs" mais avoir encore des analyse à faire qui en ajouterons peut etre ...
} while (my_thread_pool.ProcessCount > 0);





Mon thread de pool appel les delegate qu'on lui passe comme ceci :










try

{


   IAsyncResult
aResult = file.OnDownloadTerminate
            .BeginInvoke(

Thread
.CurrentThread, !error, filetype,

null
,

null
);


   aResult.AsyncWaitHandle.WaitOne();    // IMPORTANT : Attend que l'appel se termine


   file.OnDownloadTerminate.EndInvoke(aResult);
}


catch
{ } // Rien de spécial a faire .. si l'utilisateur sait pas écrire du code fiable c'est son probleme




Au départ il n'y a qu'un élément dans trucs.
Une tâche est donc affecté à mon pool de thread (classe que j'ai codé, qui est plus complexe que la classe de pool de thread) auquel je fournis du code à appeler quand latache "t" se termine.
Point important :
Le sous thread de mon pool qui analyse truc et auquel on passe un delegate DOIT attendre que le code du delegate soit executé avant de continuer.. parce en gros ce qu'il fait apres c'est de decrementer my_thread_pool.ProcessCount !
Si my_thread_pool.ProcessCount vaut zero le thread principale se barre ... sans que le delegate n'ait été appelé
Mais avec BeginInvoke et EndInvoke pas de probleme il attend justement :)
Le probleme c'est justement qu'il attend indefiniment ...
Quelle(s) instruction(s) mettre quelquepart dans les deux boucles pour que le sous thread se synchronise et execute le delegate ?
Je me souviens (houla c'est loin :) ..) qu'en VB y'a DoEvent qui permet de traiter les evenements sur la pile "des choses à faire" avant de continuer l'execution du code sur lequel on etait ...
Y'aurait pas un équivalent en C# ?




Merci !!!



-={[ Zeroc00l ]}=-

2 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
14 janv. 2008 à 11:35
l'équivalent du DoEvent...

Application.DoEvents();

Voila ;)

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
3
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
15 janv. 2008 à 02:19
Je ne comprends pas ... Mon code marche maintenant sans Application.DoEvents(); :-/
Il n'y a plus de bloquage (j'ai bien verifié avec des breakpoints bien placé pour vérifier que c'etait pas le hasard )
A n'y rien comprendre !
Cela dit tu as répondu à ce que je demandais... même si je ne suis pas persuadé que cela débloquera les delegates la prochaine fois que je retomberais sur le problème.

Merci !
(je pense jamais au namespace Application ... :-/)

-={[ Zeroc00l ]}=-
0
Rejoignez-nous