0

私はSilverlightアプリケーションを開発しており、非同期メソッドを使用してWCFサービスを利用しています。しかし、私はそれを機能させることができませんでした。

私のページには以下のコードがあります。基本的に、最初にLoginAsync、次にGetTablesAsync、次にGetPlayersAsyncを呼び出し、その間にクライアントの通知メソッドも呼び出す必要があります。どうすれば手配できますか?ロックを使用するか、これらのイベントをチェーンして正常に動作することを確認する方法はありますか?

public partial class Root : UserControl
{
    private object syncRoot = new object();
    ServiceClient client;

    ObservableCollection<Table> Tables { get; set; }
    ObservableCollection<Player> Players { get; set; }
    public Root()
    {
        InitializeComponent();

        Tables = new ObservableCollection<Table>();

        txtLogs.Text += "\n";

        client = Helpers.GetServiceClient();

        client.NotifyReceived += new EventHandler<NotifyReceivedEventArgs>(client_NotifyReceived);

        client.PublishCompleted += new EventHandler<AsyncCompletedEventArgs>(client_PublishCompleted);
        client.SubscribeCompleted += new EventHandler<AsyncCompletedEventArgs>(client_SubscribeCompleted);
        client.GetTableListCompleted += client_GetPokerTablesCompleted;



        this.Loaded += Root_Loaded;
    }

    void Root_Loaded(object sender, RoutedEventArgs e)
    {
        NewUser newUser = new NewUser();
        newUser.Closed += newUser_Closed;
        newUser.Show();
    }

    void newUser_Closed(object sender, EventArgs e)
    {
        NewUser n = sender as NewUser;
        player = new Player
        {
            PlayerName = n.txtPlayerName.Text,
        };

        lock (syncRoot)
        {

            try
            {
                client.GetTableListAsync();
            }
            catch (TimeoutException ex)
            {

            }
            catch (CommunicationException ex)
            {

            }
        }


        lock (syncRoot)
        {
            client.LoginCompleted += client_LoginCompleted;
            client.LoginAsync(player.PlayerName);
            // publish player logged in
            client.PublishAsync(String.Format("{0} is logged in", player.PlayerName));
        }


    }
4

2 に答える 2

1

次々と呼びたいということですか?ログイン完了ハンドラーから2番目のハンドラーを呼び出すことができます(次に、2番目のハンドラーのハンドラーから3番目のハンドラーを呼び出すなど)。

于 2012-09-09T14:03:16.837 に答える
0

あなたが説明したシナリオには、AsyncCTPが最も役立つことがわかりました。ただし、次のパターンを使用すると、ほぼjavascriptライブラリとほぼ同じ可読性を実現できます。

NewUser newUser = new NewUser();
newUser.Show();
newUser.Closed += (object sender, EventArgs e) =>
{
    player = new Player
    {
        PlayerName = newUser.txtPlayerName.Text,
    };

    // you aren't going to be able to catch timeout
    // errors in async method calls
    client.GetTableListAsync();

    // we can initiate login even if TableList isn't loaded yet
    client.LoginAsync(player.PlayerName);
    client.LoginCompleted += (s2, e2) => {
        // publish player logged in
        client.PublishAsync(String.Format("{0} is logged in", player.PlayerName));
    }
}
于 2012-09-10T11:46:12.303 に答える