F# 在F中等待接收对象#
这与相同,但在F#中 C#解决方案如下所示: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
静态异步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:不确定我应该如何解决我的问题,这非常类似于,但在我的例子中,输入是网络流而不是串行端口。我看不到问题的描述。你的代码不知怎的不起作用吗?怎么用?还是不编译?那么错误是什么呢?