1

WindowsPhone7アプリケーションでcompletedメソッドとasyncメソッドを使用する際に問題が発生しました。

私のコードはここにあります:

private void messageClient_getMessageOfUserCompleted(object sender, ADRTRYST_CLIENT.LocalHostMessageService.getMessageOfUserCompletedEventArgs e)
    {
        //lstBxMessages.ItemsSource = e.Result;

        System.Collections.ObjectModel.ObservableCollection<ADRTRYST_CLIENT.LocalHostMessageService.OBJMessage> mesList = e.Result;
        foreach (ADRTRYST_CLIENT.LocalHostMessageService.OBJMessage mes in mesList)
        {
            MessageObj message = new MessageObj();
            message.Date = mes.MessageDate;
            messageList.Add(message);
            ADRTRYST_CLIENT.LocalHostMemberShipService.MemberShipSoapClient memClient = new ADRTRYST_CLIENT.LocalHostMemberShipService.MemberShipSoapClient();
            MessageBox.Show(memClient.State.ToString());
            memClient.GetUserByUserIdCompleted += new EventHandler<ADRTRYST_CLIENT.LocalHostMemberShipService.GetUserByUserIdCompletedEventArgs>(memClient_GetUserByUserIdCompleted);  
            memClient.GetUserByUserIdAsync(mes.SenderUserID);

            lstBxMessages.Items.Add(mes.MessageDate);

        }
    }


    private void memClient_GetUserByUserIdCompleted(object sender, ADRTRYST_CLIENT.LocalHostMemberShipService.GetUserByUserIdCompletedEventArgs e)
    {

        ADRTRYST_CLIENT.LocalHostMemberShipService.OBJPerson user = e.Result;
        if (user != null)
            lstBxMessages.Items.Add(user.UserName);

    }

リストボックスにメッセージの日付が表示され、次にメッセージの送信者が表示されることを期待していました。ただし、最初にすべての日付がリストされ、次に送信者名がリストボックスにリストされます。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

イベントは非同期で発生するため、ListBox は最初MessageDatesforeachループ内のすべてで埋められます。が完了イベント引数の一部でない場合MessageDateは、完了イベントの匿名メソッドを使用して、リスト ボックスにMessageDateand を入力できUserます。

memClient.GetUserByUserIdCompleted += (obj, e) => 
{
    if (e.Result == null)
        return;

    lstBxMessages.Items.Add(mes.MessageDate);
    lstBxMessages.Items.Add(e.Result.UserName);
}
memClient.GetUserByUserIdAsync(mes.SenderUserID);
于 2012-05-01T21:19:35.823 に答える