0

我有以下查找联系人的代码片段(例如):

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 只是很快返回,但这没有什么区别。

任何人都可以解释一下吗?

4

2 回答 2

5

这与委托是否是使用匿名方法创建的无关。只是这manager.SearchFor显然是一个同步方法,直到查找完成才返回。诚然,这使得它有一个“查找完成”事件有点奇怪......看起来你可以将你的方法简化为:

public string Search()
{
    ContactManager manager = new ContactManager();
    manager.SearchFor("bob");
    return manager.Address;
}

现在可能还有一个可用的异步选项ContactManager- 如果不了解该类的更多信息,很难说。如果有异步选项,您应该考虑您真正想要的行为......您是否对Search同步感到满意,或者您是否真的希望它立即完成并在搜索完成后采取一些行动?

于 2011-02-12T11:06:58.907 回答
1

这取决于ContactManager类的实现。如果它是单线程和同步的,它不能更早返回,那么工作就完成了。

于 2011-02-12T11:07:57.940 回答