ios - F# 异步 lambda 声明

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

最佳答案

我没有安装 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/

相关文章:

ios - 复杂 UITableViewCell 的问题

javascript - Promise 是异步解决还是同步解决?

linq - 如何使用 LINQ 等待 ParallelQuery?

haskell - J 风格的副词、 fork 等是否通过主流函数式语言的库进行了模拟?

ios - 使用ARKIT检测人脸不同部分

iphone - 将 NSString 发送到另一个 UIViewController 给出 null

ios - 如何从 Material Inspector 设置 colorBufferWriteMask

silverlight - 如何取消 Silverlight/WCF 中的异步操作?

reflection - 如何从字符串中获取有区别的联合案例?

f# - 没有参数列表的类定义