У меня есть следующий фрагмент кода (в качестве примера), который ищет контакт:
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
}
Обновление:
Вот контакт-менеджер:
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);
}
}
}
Метод Search
не возвращается, пока не сработает это событие (поведение, которое я не осознавал, было стандартным для анонимных методов / делегатов).
Я запутался, однако, как код, сгенерированный для анонимного делегата, сигнализирует метод Search
, когда он завершен.
Я пытался поместить Sleep (5000) в свойство ContactManager.Address, поскольку я думал, что это могло быть из ContactManager, просто возвращающего очень быстро, но это не имеет значения.
Может ли кто-нибудь пролить свет?