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变量),然后在以后的代码中使用。
这比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,但尝试是我们学习的方式!