F# 在F中等待接收对象#

F# 在F中等待接收对象#,f#,system.reactive,F#,System.reactive,这与相同,但在F#中 C#解决方案如下所示: 静态异步void Foo() { var subject=新的subject(); var firstInt=subject.FirstAsync().PublishLast(); firstInt.Connect(); 主题.OnNext(42); var x=等待第一个整数; Console.WriteLine(“完成等待:+x”); } 我在F#中的尝试是: let foo()= 异步的{ 使用主题=新主题() 让firstInt=subje

这与相同,但在F#中

C#解决方案如下所示:

静态异步void Foo()
{
var subject=新的subject();
var firstInt=subject.FirstAsync().PublishLast();
firstInt.Connect();
主题.OnNext(42);
var x=等待第一个整数;
Console.WriteLine(“完成等待:+x”);
}
我在F#中的尝试是:

let foo()=
异步的{
使用主题=新主题()
让firstInt=subject.FirstAsync().PublishLast()
firstInt.Connect()|>忽略
主题.OnNext(42)
设!x=firstInt
printfn“完成等待:%d”x
返回()
}

让x!=firstInt
给出编译错误
进一步挖掘后,该表达式的类型应该是Async,当您
等待
某个东西时,C#似乎在引擎盖下调用
GetAwaiter()
。对于
Subject
IObservable
GetAwaiter
返回一个
AsyncSubject
,这在F#中不是立即有用的,但是
System.Reactive.Threading.Tasks中的
ToTask
扩展方法使其有用。显然,您可以直接将
ToTask
应用于
主题(或
IObservable
),而无需通过
GetAwaiter
,因此通过更改
let解决了我的问题!x…
语句,用于:

    let! x = firstInt.ToTask() |> Async.AwaitTask
编辑:

有更好的办法 使用是实现同样目标的更好方法:

打开FSharpx.Control.Observable
让富()=
异步的{
使用主题=新主题()
主题.OnNext(42)
设!x=Async.await可观察主题
printfn“完成等待:%d”x
返回()
}

在F#中没有需要执行的隐式界面转换
x:>i出于兴趣,您必须使用主题吗?我的理解是,这是不被推荐的:关于避免可变状态的观点在F#中变得更为相关。@JohnPalmer:问题是,我不知道在这种情况下我应该是什么接口,或者甚至不知道在这种情况下是否需要接口转换。@TheInnerLight:不确定我应该如何解决我的问题,这非常类似于,但在我的例子中,输入是网络流而不是串行端口。我看不到问题的描述。你的代码不知怎的不起作用吗?怎么用?还是不编译?那么错误是什么呢?