在 C# Xamarin iOS 中我可以这样做:
InvokeOnMainThread( () => { //do stuff here});
其中 InvokeOnMainThread 的参数是 NSAction
在 F# 中我必须做
InvokeOnMainThread (new NSAction(fun _ -> //do stuff here))
但在 C# 中我也可以这样做
InvokeOnMainThread (async () => { //do stuff here});
我如何在 F# 中做同样的事情?
另外,就我而言,在 C# 中我这样做:
InvokeOnMainThread(async() => { await Task.Delay(1100); });
我如何在 F# 中表达同样的事情?
最佳答案
我没有安装 Xamarin 来实际尝试这个,但我认为以下应该可以解决问题:
InvokeOnMainThread(NSAction(fun _ ->
async { do! Async.Sleep(1000)
(* some more stuff *) }
|> Async.StartImmediate
))
我有点困惑为什么需要指定 NSAction
委托(delegate)类型,但我猜它可能存在一些重载问题,所以也许确实需要它。
上面的示例创建了一个普通的 lambda 函数,该函数在函数体内创建一个异步 block ,然后立即在当前线程上启动它。这是一个合理的选择,因为您从 sleep 开始 - 但如果您正在进行一些 CPU 密集型工作,最好使用 Async.Start
在后台启动异步。
关于ios - F# 异步 lambda 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24837513/