我可以在 F# PCL 库中使用 System.Timers.Timer 吗?
Can I use System.Timers.Timer in an F# PCL library?
我需要在 F# PCL 库中使用 System.Timers.Timer
。
我目前的目标是框架 4.5 并使用 Profile7(我使用的是 VS 模板),它不允许访问 System.Timer。
根据 this SO answer,这是一个已知问题,已在 4.5.1 中解决。
我创建了一个 4.5.1 C# PCL 并检查了它的 .csproj。它针对框架 4.6 并使用 Profile32。
有没有办法在 F# 项目中实现相同目标?我天真地尝试用 C# 值更新 .fsproj,但它破坏了一切。 :)
非常感谢!
System.Timers.Timer
(和 System.Threading.Timer
)classes 在主 F# PCL 配置文件中不起作用。鉴于支持正常的 F# 异步,您可以通过编写自己的 "timer" 类型轻松解决此问题。例如,以下(虽然有点难看)应该相当好地模仿 Timer
class 功能:
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
我需要在 F# PCL 库中使用 System.Timers.Timer
。
我目前的目标是框架 4.5 并使用 Profile7(我使用的是 VS 模板),它不允许访问 System.Timer。
根据 this SO answer,这是一个已知问题,已在 4.5.1 中解决。
我创建了一个 4.5.1 C# PCL 并检查了它的 .csproj。它针对框架 4.6 并使用 Profile32。
有没有办法在 F# 项目中实现相同目标?我天真地尝试用 C# 值更新 .fsproj,但它破坏了一切。 :)
非常感谢!
System.Timers.Timer
(和 System.Threading.Timer
)classes 在主 F# PCL 配置文件中不起作用。鉴于支持正常的 F# 异步,您可以通过编写自己的 "timer" 类型轻松解决此问题。例如,以下(虽然有点难看)应该相当好地模仿 Timer
class 功能:
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