Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios F#异步lambda声明_Ios_Asynchronous_F#_Xamarin - Fatal编程技术网

Ios F#异步lambda声明

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

在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
委托类型,但我想它可能有一些重载问题,所以可能实际上需要它


上面的示例创建了一个普通lambda函数,该函数在函数体中创建一个异步块,然后立即在当前线程上启动它。这是一个合理的选择,因为您是从睡眠开始的,但是如果您正在做一些CPU密集型的工作,那么最好在后台使用
async启动async。start

谢谢!事实上,在问前面的问题之前,我应该阅读更多关于github的示例。你可以说InvokeOnMainThread(fun()->…),而不是声明新的NSAction和使用fun->,也许这只是一个学习过程
InvokeOnMainThread(async()=>{/*do stuff here*/})
如果读取正确,这将从lambda创建一个
async void
方法。这可能不是您想要的(尝试在延迟后抛出异常)。