我能在 F# PCL 库中使用 System.Timers.Timer 吗?

3
我需要在F# PCL库中使用System.Timers.Timer
目前我正在针对框架4.5进行开发,并使用Profile7(我使用了VS模板),但它不允许访问System.Timer。
根据这篇SO答案,这是一个已知的问题,在4.5.1中已解决。
我创建了一个4.5.1的C# PCL,并检查了它的.csproj。它针对框架4.6,并使用Profile32。
有没有办法在F#项目中使用相同的配置?我天真地尝试使用C#值更新.fsproj,但一切都崩溃了。 :)
非常感谢!

特洛伊 - 你是否尝试使用 System.Timers.Timer (即:https://msdn.microsoft.com/zh-cn/library/system.timers.timer%28v=vs.110%29.aspx)?你需要对计时器做什么? - Reed Copsey
需要使用计时器吗?你可以使用async或类似的方法来解决这个问题,它在PCL7中可以工作... - Reed Copsey
不,我不必使用计时器。使用异步和递归对我来说足够了,但是我错过了框架的哪些其他部分呢? :) - Troy Kershaw
1
计时器类(两个)是我知道在配置文件中缺失的最重要的一个,但应该存在... - Reed Copsey
1个回答

5

System.Timers.Timer(以及System.Threading.Timer)类在主要的F# PCL配置文件中无法使用。鉴于普通的F#异步受支持,您可以通过编写自己的“定时器”类型轻松解决此问题。例如,以下内容(虽然有点丑陋)应该能够合理地模拟Timer类的功能:

type PclTimer(interval, callback) = 
    let mb = new MailboxProcessor<bool>(fun inbox ->
            async { 
                let stop = ref false
                while not !stop do
                    // Sleep for our interval time
                    do! Async.Sleep interval

                    // Timers raise on threadpool threads - mimic that behavior here
                    do! Async.SwitchToThreadPool()
                    callback()

                    // Check for our stop message
                    let! msg = inbox.TryReceive(1)
                    stop := defaultArg msg false
            })

    member __.Start() = mb.Start()
    member __.Stop() = mb.Post true

谢谢Reed,你真是个明星!! - Troy Kershaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接