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 に答える