je l'extrait suivant du code (par exemple) qui recherche un contact:Comment une méthode attend jusqu'à la fin d'un délégué anonyme?
public string Search()
{
string address = "";
ContactManager manager = new ContactManager();
// LookupComplete is just a plain event
manager.LookupComplete += delegate
{
address = manager.Address;
};
manager.SearchFor("bob");
return address; // Address always appears to be populated
}
Mise à jour:
Voici le ContactManager:
public class ContactManager
{
public string Address {get;set;}
public event LookupComplete;
public void SearchFor(string query)
{
SomeParser parser = new Parser();
parser.TokenParsed += new EventHandler<TokenParseEventArgs>(tokenParsed);
parser.Parse(query);
}
private void tokenParsed(object sender,TokenParseEventArgs e)
{
if (e.Message == "EOF")
{
Address = e.Message.Address;
if (LookupComplete != null)
LookupComplete(this,EventArgs.Empty);
}
}
}
La méthode Search
ne le fait pas retourner jusqu'à ce que cet événement soit déclenché (un comportement que je n'avais pas réalisé était standard pour les méthodes/délégués anonymes).
Je suis confus cependant comment le code généré pour le délégué anonyme signale la méthode Search
quand il est terminé.
J'ai essayé de mettre un Sleep (5000) dans la propriété ContactManager.Address car je pensais que cela pouvait provenir du ContactManager qui revenait très rapidement, mais cela ne fait aucune différence.
Quelqu'un peut-il jeter de la lumière?
J'ai essayé de le simplifier avec des contacts, le 'ContactManager' est en fait ceci: http://hg.shrinkrays.net/spruce/src/0e9aee07563e/Spruce.Core/Search/SearchParser.cs. Il analyse les jetons dans une requête, mais ne fonctionne pas de manière synchrone autant que je le sache. –
@Chris S: Je ne vois rien dans ce code suggérant que c'est asynchrone ... mais je ne vois pas le code pour LALRParser . Y a-t-il de la documentation qui vous suggère que c'est vraiment * as * asynchrone? –
@Chris S Je n'ai trouvé aucun appel asynchrone là – gor