2011-02-12 97 views
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,只是非常快速地返回,但這沒有區別。

任何人都可以擺脫任何光線?

回答

5

這與代理是否使用匿名方法創建無關。只是manager.SearchFor顯然是一種同步方法,直到查找完成纔會返回。這使得它有點奇怪爲它具有「查找完成」事件,不可否認......它看起來像你可以簡化你的方法簡單:

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

現在可能是有異步選項可在ContactManager上獲得 - 如果不知道更多關於課程的信息,很難說。如果是一個異步選項,您應該考慮您實際需要的行爲...您是否滿意Search是同步的,還是您確實希望它在搜索完成後立即完成並採取一些操作?

+0

我試圖用聯繫人簡化它,'ContactManager'實際上是這樣的:http://hg.shrinkrays.net/spruce/src/0e9aee07563e/Spruce.Core/Search/SearchParser.cs。它解析了查詢中的令牌,但是並沒有像我知道的那樣同步運行 – 2011-02-12 11:14:44

1

這取決於ContactManager類的實現。如果它是單線程的並且同步的,它不能更早地返回,那麼工作就完成了。