一个方法如何等到匿名委托完成?

时间:2011-02-12 11:02:21

标签: 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
}

更新
这是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,只是很快返回,但这没有任何区别。

任何人都可以光明吗?

2 个答案:

答案 0 :(得分:5)

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

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

现在有可能 ContactManager上有一个异步选项 - 如果不了解更多有关该类的内容,很难说。如果一个异步选项,你应该考虑你真正想要的行为......你对同步Search感到满意,还是你真的希望它立即完成并采取一些行动什么时候搜索结束了?

答案 1 :(得分:1)

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