首页 > 学院 > 开发设计 > 正文

与现有异步源桥接

2019-11-06 06:43:09
字体:
来源:转载
供稿:网友

  除.NET事件外,.NET Framework中还存在其他异步数据源。 其中之一是异步方法模式。 在该设计模式中,提供了两种方法。 一个方法(通常命名为BeginX)用于启动计算并返回一个IAsyncResult句柄,该句柄传递给第二个方法(通常称为EndX),然后检索计算结果。 完成通常通过实现AsyncCallback委托或轮询IAsyncResult.IsCompleted来发出信号。 代码坚持这种模式往往难以阅读和维护。 在本主题中,我们将演示如何使用Rx工厂方法将这些异步数据源转换为可观察的序列。

将异步模式转换为可观察序列

  .NET中的许多异步方法都使用像BeginX和EndX这样的签名来编写,其中X是异步执行的方法名。 BeginX使用参数来执行该方法,一个AsyncCallback是一个动作,它接受一个I​​AsyncResult并不返回任何东西,最后是一个对象状态。 EndX接受从AsyncCallback传入的IAsyncResult,以检索异步调用的值。 Observable类型的FromAsyncPattern运算符包装Begin和End方法(作为参数传递给运算符),并返回一个与Begin相同的参数并返回一个observable的函数。这个observable表示发布单个值的序列,这是您刚才指定的调用的异步结果。 在下面的示例中,我们将使用IAsyncResult模式将Stream对象的BeginRead和EndRead转换为返回可观察序列的函数。对于FromAsyncPattern运算符的通用参数,我们指定BeginRead的参数的类型,直到回调。由于EndRead方法返回一个值,我们将这个类型作为FromAsyncPattern的最终通用参数。如果将鼠标悬停在var上进行读取,您会注意到,FromAsyncPattern的返回值是一个具有以下签名的函数委托:Func

Stream inputStream = Console.OpenStandardInput();var read = Observable.FromAsyncPattern<byte[], int, int, int>(inputStream.BeginRead, inputStream.EndRead);byte[] someBytes = new byte[10];IObservable<int> source = read(someBytes, 0, 10);IDisposable subscription = source.Subscribe( x => Console.WriteLine("OnNext: {0}", x), ex => Console.WriteLine("OnError: {0}", ex.Message), () => Console.WriteLine("OnCompleted"));Console.ReadKey();
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表