【问题标题】:Silverlight: Returning value from synchronous method using RxSilverlight:使用 Rx 从同步方法返回值
【发布时间】:2013-03-23 05:35:14
【问题描述】:

我正在编写一个简单的 Silverlight 应用程序和 WCF 服务。 我想创建一个返回值的同步方法。 方法本身,从 WCF 服务调用异步方法。调用异步方法后,我想获取它的值,并返回给发送者。 听说Rx可以解决这类问题。

这是我的代码:

    private void btnCreate_Click(object sender, RoutedEventArgs e)
    {
        string myResult = getMyBook(txtBookName.Text);
        MessageBox.Show("Result\n" + myResult);
        // myResult will be use for another purpose here..
    }

    // I want this method can be called anywhere, as long as the caller still in the same namespace.
    public string getMyBook(string bookName)
    {
        Servo.ServoClient svc = new ServoClient();
        string returnValue = "";

        var o = Observable.FromEventPattern<GetBookCompletedEventArgs>(svc, "GetBookCompleted");
        o.Subscribe(
            b => returnValue = b.EventArgs.Result
            );

        svc.GetBookAsync(bookName);
        return returnValue;
    }

当我单击 btnCreate 时,myResult 变量仍然为空。我的代码有问题吗?或者也许我只是不了解 Rx 的概念?我是 Rx 的新手。

我的目标是:我需要从异步方法中获取结果(myResult变量),然后在后面的代码中使用。

【问题讨论】:

    标签: c# wcf silverlight asynchronous system.reactive


    【解决方案1】:

    这比 Rx 更适合 async/await 关键字。 Rx 主要用于管理数据流,而在这种情况下,您要做的就是同步管理异步调用。你可以尝试像这样使用 Rx:

    public string getMyBook(string bookName)
    {
        Servo.ServoClient svc = new ServoClient();
        svc.GetBookAsync(bookName);
    
        var o = Observable.FromEventPattern<GetBookCompletedEventArgs>(svc, "GetBookCompleted");
        return o.First().EventArgs.Result;
    }
    

    但是,如果 GetBookAsync 在您订阅之前引发事件,则线程将永远阻塞。您可以使用.Replay().Connect(),但您应该只使用async/await

    【讨论】:

      【解决方案2】:

      请记住,GetBookAsync 会立即返回,并将返回存储在 returnvalue 中的值。当数据到达时,返回值将超出范围,届时 btnCreate 将完成。

      U 可以在 GetBookAsync 上使用 await,这样它将等待数据到达后再继续。不要忘记这意味着你还需要方法上的异步。

      RX 或 await 都不是一个很好的例子或使用,但尝试是我们学习的方式!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        • 2017-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多