Ios F#异步lambda声明
在C#Xamarin iOS中,我可以做到:Ios F#异步lambda声明,ios,asynchronous,f#,xamarin,Ios,Asynchronous,F#,Xamarin,在C#Xamarin iOS中,我可以做到: InvokeOnMainThread( () => { //do stuff here}); 其中InvokeOnMainThread的参数为NSAction 在F#我必须做 InvokeOnMainThread (new NSAction(fun _ -> //do stuff here)) 但在C#中,我也能做到 InvokeOnMainThread (async () => { //do stuff here}); 在F
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
委托类型,但我想它可能有一些重载问题,所以可能实际上需要它
上面的示例创建了一个普通lambda函数,该函数在函数体中创建一个异步块,然后立即在当前线程上启动它。这是一个合理的选择,因为您是从睡眠开始的,但是如果您正在做一些CPU密集型的工作,那么最好在后台使用
async启动async。start
谢谢!事实上,在问前面的问题之前,我应该阅读更多关于github的示例。你可以说InvokeOnMainThread(fun()->…),而不是声明新的NSAction和使用fun->,也许这只是一个学习过程InvokeOnMainThread(async()=>{/*do stuff here*/})
如果读取正确,这将从lambda创建一个async void
方法。这可能不是您想要的(尝试在延迟后抛出异常)。