我有下面的代碼片段(作爲例子)中查找聯繫人:方法如何等待匿名委託完成?
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,只是非常快速地返回,但這沒有區別。
任何人都可以擺脫任何光線?
我試圖用聯繫人簡化它,'ContactManager'實際上是這樣的:http://hg.shrinkrays.net/spruce/src/0e9aee07563e/Spruce.Core/Search/SearchParser.cs。它解析了查詢中的令牌,但是並沒有像我知道的那樣同步運行 – 2011-02-12 11:14:44