我有以下代码片段(作为示例)查找联系人:
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,只是很快返回,但这没有任何区别。
任何人都可以光明吗?
答案 0 :(得分:5)
这与委托是否是使用匿名方法创建无关。只是manager.SearchFor
显然是一个同步方法,在查找完成之前不会返回。这使得它有一个“查找完成”的事件有点奇怪,不可否认......看起来你可以简化你的方法简单:
public string Search()
{
ContactManager manager = new ContactManager();
manager.SearchFor("bob");
return manager.Address;
}
现在有可能还 ContactManager
上有一个异步选项 - 如果不了解更多有关该类的内容,很难说。如果是一个异步选项,你应该考虑你真正想要的行为......你对同步Search
感到满意,还是你真的希望它立即完成并采取一些行动什么时候搜索结束了?
答案 1 :(得分:1)
这取决于ContactManager
类的实现。如果它是单线程和同步它不能提前返回,那么工作就完成了。