F#异步lambda声明

时间:2014-07-19 06:37:34

标签: 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#中做同样的事情?


另外,就我而言,在C#中我这样做:

InvokeOnMainThread(async() => { await Task.Delay(1100); });

我怎样才能在F#中表达同样的事情?

1 个答案:

答案 0 :(得分:1)

我没有安装Xamarin来实际尝试这个,但我认为以下应该可以解决这个问题:

InvokeOnMainThread(NSAction(fun _ -> 
   async { do! Async.Sleep(1000)
           (* some more stuff *) }
   |> Async.StartImmediate
))

我有点疑惑为什么你需要指定NSAction委托类型,但我想可能会有一些超载问题,所以也许实际上需要它。

上面的例子创建了一个普通的lambda函数,它在函数体内创建一个异步块,然后立即在当前线程上启动它。这是一个合理的选择,因为你从睡眠开始 - 但如果你正在做一些CPU密集型工作,最好使用Async.Start在后​​台启动异步。