Поле, конструктор или член 'AsyncReadToEnd' не определены ошибка - PullRequest
3 голосов
/ 02 января 2012

Я изучаю 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 # могут произойти некоторые изменения.Для моей текущей среды, как правильно переписать приведенный выше код?Спасибо и счастливого нового года всем вам!John

Ответы [ 2 ]

5 голосов
/ 02 января 2012

AsyncReadToEnd() метод расширения StreamReader теперь является частью FSharpPowerPack .Установите FSharpPowerPack из этой ссылки, если еще нет, то добавьте ссылку на FSharp.PowerPack в свой проект.Это должно сделать метод AsyncReadToEnd() доступным из остальной части вашего кода.

2 голосов
/ 25 апреля 2014

Использовать выделенный тип AsyncStreamReader

AsyncReadToEnd() метод расширения больше не существует в FSharp.PowerPack . Он был заменен выделенным типом AsyncStreamReader, который содержит правильную асинхронную реализацию потокового чтения (например, ReadToEnd, ReadLine и т. Д.)

Может использоваться так:

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

Примечание. После установки FSharp.PowerPack тип AsyncStreamReader будет «введен» в пространство имен Microsoft.FSharp.Control

.

Другой связанный ответ: https://stackoverflow.com/a/7925440/1480391

...