Appel synchrone bloquant (code TRES simplifié) [Résolu]

cs_Zeroc00l 370 Messages postés lundi 1 avril 2002Date d'inscription 11 février 2010 Dernière intervention - 14 janv. 2008 à 05:10 - Dernière réponse : cs_Zeroc00l 370 Messages postés lundi 1 avril 2002Date d'inscription 11 février 2010 Dernière intervention
- 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 ]}=-
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 14 janv. 2008 à 11:35
3
Merci
l'équivalent du DoEvent...

Application.DoEvents();

Voila ;)

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]

Merci sebmafate 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de sebmafate
cs_Zeroc00l 370 Messages postés lundi 1 avril 2002Date d'inscription 11 février 2010 Dernière intervention - 15 janv. 2008 à 02:19
0
Merci
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 ]}=-
Commenter la réponse de cs_Zeroc00l

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.