Silverlight:使用Rx从同步方法返回值

本文关键字:同步方法 返回值 Rx 使用 Silverlight | 更新日期: 2023-09-27 18:05:19

我正在编写一个简单的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变量),然后在以后的代码中使用。

Silverlight:使用Rx从同步方法返回值

这比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 !

记住GetBookAsync会立即返回,并且会返回存储在returnvalue中的值。当数据到达时,returnvalue将超出作用域,到那时btnCreate将完成。

你可以在GetBookAsync上使用await,这样它就会在继续之前等待数据到达。别忘了,这意味着你还需要对方法进行async。

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