我試圖讓F#異步工作,我只是無法弄清楚我做錯了什麼。這裏是我的運行八九不離十syncronous代碼:如何使此功能正確異步?
open System.Net
open System.Runtime.Serialization
open System.Threading.Tasks
[<DataContract>]
type Person = {
[<field: DataMember(Name = "name")>]
Name : string
[<field: DataMember(Name = "phone")>]
Phone : int
}
let url = "http://localhost:5000/app/plugins/anon/CCure"
let js = Json.DataContractJsonSerializer(typeof<Person>)
let main x =
let client = new WebClient()
let url = url + "/" + x
let reader = client.OpenRead(url)
let person = js.ReadObject(reader) :?> Person
printfn "Name: %s, Phone number: %d" person.Name person.Phone
printfn "starting x"
let x = Task.Factory.StartNew(fun() -> main "x")
printfn "starting y"
let y = Task.Factory.StartNew(fun() -> main "y")
Task.WaitAll(x, y)
我想,運行它asyncronously這會工作,但不會:
open System.Net
open System.Runtime.Serialization
open System.Threading.Tasks
[<DataContract>]
type Person = {
[<field: DataMember(Name = "name")>]
Name : string
[<field: DataMember(Name = "phone")>]
Phone : int
}
let url = "http://localhost:5000/app/plugins/anon/CCure"
let js = Json.DataContractJsonSerializer(typeof<Person>)
let main x = async {
let client = new WebClient()
let url = url + "/" + x
let! reader = client.OpenReadAsync(url)
let person = js.ReadObject(reader) :?> Person
printfn "Name: %s, Phone number: %d" person.Name person.Phone }
printfn "starting x"
let x = Task.Factory.StartNew(fun() -> main "x")
printfn "starting y"
let y = Task.Factory.StartNew(fun() -> main "y")
Task.WaitAll(x, y)
$ fsharpc -r System.Runtime。系列化foo.fs & & ./foo.exe F# 編譯器F#3.1(開源版)的 Apache 2.0的開源許可下可自由分佈
/home/frew/code/foo.fs(19,18):錯誤FS0001的: 預期該表達式爲具有類型 異步<「一>但這裏有類型 單元
/家/弗魯/代碼/ foo.fs(20,17):錯誤FS0041:無法根據此程序點之前的類型信息 確定方法'ReadObject'的唯一過載 。可能需要類型註釋。 候選人:XmlObjectSerializer.ReadObject(讀取器: System.Xml.XmlDictionaryReader):OBJ, XmlObjectSerializer.ReadObject(讀取器:System.Xml.XmlReader):OBJ, XmlObjectSerializer.ReadObject(流:System.IO.Stream):OBJ
/home/frew/code/foo.fs(20,17):錯誤FS0008:此運行時強制或從 「型 類型測試一個到 人涉及基於之前該程序點信息的不確定的類型。運行時類型測試不允許在 某些類型。需要進一步的類型註釋。
我在這裏錯過了什麼?
我的猜測是主要異步塊中的'printfn'語句。也許增加'人'作爲回報會有所幫助。 – leppie