字段,构造函数或成员'AsyncReadToEnd'未定义错误

时间:2012-01-01 21:00:22

标签: f# system.reactive

我正在学习RX(Reactive Extensions),并且发现有人在近一年前使用F#和RX发布了一些代码来制作一个简单的webCrawler。我试着看看我是否可以重用代码。我下载了RX,并创建了一个F#windows应用程序,添加了对System.Reactive的引用。我的IDE是VS 2010 Ultimate,RX版本是:1.1.11111。以下是代码:

#light
open System
open System.Linq
open System.Collections.Generic
open System.Net
open System.IO
open System.Threading
open System.Text.RegularExpressions
open System.Reactive
open System.Reactive.Linq

let create f =
    Observable.Create<_>(fun x ->
        f x
        new System.Action((fun () -> ())))

let ofAsync async =
    create (fun obs -> Async.StartWithContinuations(async, obs.OnNext,obs.OnError,obs.OnError))

let fromEvent (event:IEvent<_,_>) = create (fun x -> event.Add x.OnNext)

let tickEvent = new Event<unit> ()
let tickEventObs = tickEvent.Publish |> fromEvent

let fetch(url:string) =
    async { let req = WebRequest.Create(url)
            let! resp = req.AsyncGetResponse()
            let stream = resp.GetResponseStream()
            let reader = new StreamReader(stream)
            let! html = reader.AsyncReadToEnd()
            return html
          } |> ofAsync

但是代码无法编译,我收到了错误消息: 错误1未定义字段,构造函数或成员“AsyncReadToEnd” 所以错误出现在这一行:

let! html = reader.AsyncReadToEnd()

我想在过去的一年中,RX或F#可能会有一些变化。 对于我目前的环境,重写上述代码的正确方法是什么? 谢谢,祝大家新年快乐! 约翰

2 个答案:

答案 0 :(得分:5)

AsyncReadToEnd() StreamReader的扩展方法现在是FSharpPowerPack的一部分。从this链接安装FSharpPowerPack(如果尚未安装),然后将FSharp.PowerPack的引用添加到您的项目中。这应该使AsyncReadToEnd()方法可以从其余代码中访问。

答案 1 :(得分:2)

使用专用的AsyncStreamReader类型

AsyncReadToEnd()扩展方法在FSharp.PowerPack中不再存在。 它已替换为 AsyncStreamReader 专用类型,其中包含正确的流读取异步实现(如ReadToEndReadLine等)。

可以这样使用:

async { 
  use asyncReader = new AsyncStreamReader(stream)
  return! asyncReader.ReadToEnd() }

注意:安装FSharp.PowerPack后,AsyncStreamReader类型将被注入&#39;在Microsoft.FSharp.Control命名空间


其他相关答案:https://stackoverflow.com/a/7925440/1480391