Chr*_*s S 0 c# events anonymous-methods anonymous-delegates
我有以下代码片段(作为示例)查找联系人:
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
}
Run Code Online (Sandbox Code Playgroud)
更新:
这是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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在Search触发该事件之前,该方法不会返回(我没有意识到的行为是匿名方法/委托的标准).
然而,我很困惑为匿名委托生成的代码如何在Search完成时发出信号.
我已经尝试在ContactManager.Address属性中放入Sleep(5000),因为我认为它可能来自ContactManager,只是非常快速地返回,但这没有任何区别.
谁能摆脱任何光明?
这与委托是否是使用匿名方法创建无关.它只是manager.SearchFor显然是一种同步方法,在查找完成之前不会返回.这使得它有一个"查找完成"的事件有点奇怪,不可否认......看起来你可以简化你的方法简单地:
public string Search()
{
ContactManager manager = new ContactManager();
manager.SearchFor("bob");
return manager.Address;
}
Run Code Online (Sandbox Code Playgroud)
现在,可以说有也可用异步选项ContactManager-这是很难不知道更多关于类的话.如果是一个异步的选项,你应该考虑你真正想要的行为......你是否觉得Search是同步的,还是你真正想要立即完成并采取了一些行动时,搜索完成后?