Exception dans méthode asynchrone

Signaler
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
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

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
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# 
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
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#]
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
e.Error est une instance d'Exception ?
Si oui, tu peux pas la rebalancer ? ( throw e.Error; )

Mx
MVP C# 
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
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#
 
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Bon bah, vu que tout est traité par le webservice, on est bien embété :/

Mx
MVP C# 
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
C'est fort dommage....
:-/

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