在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#中表达同样的事情?
答案 0 :(得分:1)
我没有安装Xamarin来实际尝试这个,但我认为以下应该可以解决这个问题:
InvokeOnMainThread(NSAction(fun _ ->
async { do! Async.Sleep(1000)
(* some more stuff *) }
|> Async.StartImmediate
))
我有点疑惑为什么你需要指定NSAction
委托类型,但我想可能会有一些超载问题,所以也许实际上需要它。
上面的例子创建了一个普通的lambda函数,它在函数体内创建一个异步块,然后立即在当前线程上启动它。这是一个合理的选择,因为你从睡眠开始 - 但如果你正在做一些CPU密集型工作,最好使用Async.Start
在后台启动异步。