Exception dans méthode asynchrone

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 9 juin 2006 à 12:00
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 9 juin 2006 à 23:21
Bonjour à tous,

Bon j'ai déjà été confronté plusieurs fois à ce problème, et je crois que je n'ai jamais vraiment trouvé de solution très propre à ce problème :

J'ai une méthode qui est appelée de manière asynchrone. Quand le processus est terminé, j'ai un event qui est déclenché, qui me permet de savoir si y'a eu des erreurs durant le processus. Si oui, j'aimerais faire quelque chose pour pouvoir prendre en charge ce probleme (comme par exemple, lever une exception), mais à vrai dire je n'arrive pas à la catcher par la suite, étant donné que je suis dans un context asynchrone.

private
void FinDeLoperation(
object sender, My
EventArgs e)
{
  
if (e.Error = =
null)
   {
      // Mon traitement
  
}
   else
   {
       // Que faire ? Sachant que je ne peux pas traiter l'erreur ici, il faut que je puisse "la remonter"
   }
}

public void Start()
{
  
this.X.StartAsyncMethod(....);

}

Si je mets un try-ctach dans la méthode Start, ça ne fonctionne pas (normal je pense).
S'il se passe un problème durant le processus, je dois évidemment faire certaine action, donc comment faire pour traiter l'erreur ?
Merci !

<hr size="2" /> VC# forever
=13319

8 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
9 juin 2006 à 12:32
Salut, 

A priori, en utilisant BeginInvoke et en utilisant EndInvoke ensuite, l'exception devrait etre "remontée" et donc catchable.

<hr />

public
delegate
void MonDelegate();

//...
try
{

   MonDelegate monDel = dd;

   IAsyncResult iar = monDel.BeginInvoke(
null,
null);
   monDel.EndInvoke(iar);
}

catch (
Exception ex)
{

   MessageBox.Show(ex.ToString());
}
<hr />

Mx
MVP C# 
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
9 juin 2006 à 12:37
mouarf... c'est à fond dans l'article que je suis en train (d'essayer) d'écrire !

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 juin 2006 à 12:47
Alors vivement qu'il sorte cet article! ;-)

Sinon, la méthode que j'appelle est en fait un WebService (tu devines lequel? lol) et le webService m'offre une méthode GetNextMoveAsync puis quand le web service a terminé le traitement, je tombe dans

private
void AIservice_GetNextMoveCompleted(
object sender,
GetNextMoveCompletedEventArgs e)
{
  
if (e.Error = =
null)
   {

        // ...
        
this._game.Move(e.Result);
   }
}
Si Error est différent de null alors ya eu un problème, (il a pas pu satisfaire ma demande, l'utlisateur était pas connecté, etc) et il faudrait que je suis puisse traiter ceci (afficher une messageBox par exemple) mais pour ça je dois faire remonter cette erreur, et à vrai dire je ne suis pas sur que ta méthode fonctionne avec le BeginInvoke.... ????

<hr size="2" /> VC# forever
=13319
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
9 juin 2006 à 12:49
e.Error est une instance d'Exception ?
Si oui, tu peux pas la rebalancer ? ( throw e.Error; )

Mx
MVP C# 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
9 juin 2006 à 12:55
Ah zut, dans mon exemple j'avais oublie de mettre la méthode "dd" qui en fait, ne fait que lever une exception.










Mx
MVP C#
 
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 juin 2006 à 13:00
Oui, de type Exception.
Ben la première chose que j'ai essayé de faire, c'est un throw e.Error, c'est clair.
Mais je n'arrive pas à la catcher !

<hr size= "2" /> VC# forever
=13319
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
9 juin 2006 à 13:35
Bon bah, vu que tout est traité par le webservice, on est bien embété :/

Mx
MVP C# 
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 juin 2006 à 23:21
C'est fort dommage....
:-/

<hr size= "2" /> VC# forever
=13319
0
Rejoignez-nous