【问题标题】:Chaining WCF Async Methods in Silverlight [closed]在 Silverlight 中链接 WCF 异步方法 [关闭]
【发布时间】:2012-09-09 13:44:19
【问题描述】:

我正在开发一个 Silverlight 应用程序并使用异步方法使用 WCF 服务。但我无法让它工作。

在我的页面中,我有以下代码。基本上我想先调用 LoginAsync 然后 GetTablesAsync 然后 GetPlayersAsync 同时我还需要调用客户端通知方法。我该如何安排?使用 Locks 还是有一种方法可以链接这些事件以确保它们能够正常运行?

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));
        }


    }

【问题讨论】:

    标签: c# wcf silverlight asynchronous


    【解决方案1】:

    你的意思是你要一个接一个地打电话给他们吗? 您可以从 Login completed 处理程序调用第二个(然后从处理程序中调用第三个完成第二个等)。

    【讨论】:

    • 它工作正常(我在我编写的软件中有这种方法)。您需要在调用 Web 服务的相同位置添加“已完成”处理程序。 (您在 UserControl 的构造函数中有完整的处理程序,但不会从那里调用服务。)
    • 是的,我发现这种方式不起作用的原因是因为我的数据合同。但是,我很高兴有更好的方法
    【解决方案2】:

    我发现 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));
        }
    }
    

    【讨论】:

    • 我认为这与我的代码相同
    • Kubi,你不能用锁链你的代码。您只需在 Completed 处理程序中调用下一个例程。上面的代码使逻辑更容易阅读。
    • 我的想法是为操作创建一个队列并管理事件。由于后台的一些其他想法,我在代码中加了锁
    • 是的,队列可以工作。我之前已经成功使用过它,但我发现替代方案更容易。
    猜你喜欢
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2011-11-30
    • 1970-01-01
    • 2021-09-15
    • 2010-11-20
    相关资源
    最近更新 更多