連絡先を検索する次のコード スニペット (例として) があります。
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
}
更新:
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);
}
}
}
メソッドは、Search
そのイベントが発生するまで返されません (私が気付いていなかった動作は、匿名メソッド/デリゲートの標準でした)。
ただし、匿名デリゲート用に生成されたコードが、Search
メソッドの完了時にメソッドにどのように通知するかについては混乱しています。
ContactManager.Address プロパティに Sleep(5000) を入れてみましたが、単に ContactManager から非常に迅速に返されたのかもしれないと思ったのですが、違いはありません。
誰でも光を当てることができますか?