F# 如果异步服务器崩溃,如何重新启动它?
我有一个移动设备的服务器,有时可能会崩溃。我需要让服务器始终处于活动状态。现在的问题是,我不知道如何在异步时重新启动服务器:F# 如果异步服务器崩溃,如何重新启动它?,f#,crash,restart,suave,F#,Crash,Restart,Suave,我有一个移动设备的服务器,有时可能会崩溃。我需要让服务器始终处于活动状态。现在的问题是,我不知道如何在异步时重新启动服务器: let startServer(rootPath) = let cf = serverConfig rootPath printfn "%A" cf startWebServerAsync cf app |> snd |> Async.StartAsTask type App() = inherit Appl
let startServer(rootPath) =
let cf = serverConfig rootPath
printfn "%A" cf
startWebServerAsync cf app
|> snd
|> Async.StartAsTask
type App() =
inherit Application()
let mutable task:System.Threading.Tasks.Task = null
do
let t = startServer(...)
task <- t //The task is hold here to avoid it being GC..
让startServer(根路径)=
让cf=serverConfig根路径
printfn“%A”cf
StartWebServer异步cf应用程序
|>snd
|>Async.startask
类型App()=
继承应用程序()
让可变任务:System.Threading.Tasks.task=null
做
设t=startServer(…)
task捕获异常,调用start方法,如下所示:
// server sample stub
let startServer(_rootPath):Async<_>=
async {
printfn "server started"
do! Async.Sleep 500
return "blah"
}
// stubs for example code to compile
type Application() = class end
type App() =
inherit Application()
let mutable task:System.Threading.Tasks.Task= null
let rec startRestartable() =
// catch the async to avoid GC
task <-
async{
let! serverResult = startServer(".") |> Async.Catch
match serverResult with
| Choice1Of2 x ->
// no exception? whatever you would do if the server terminates normally
// I'll assume you want a restart
// all paths lead to restart, do nothing here
printfn "Server finished? why? %A" x
()
| Choice2Of2 ex ->
// log exception, poor logging example stub
eprintfn "server crash: %A" ex
startRestartable()
}
|> Async.StartAsTask
do
printfn "Starting"
startRestartable()
//服务器示例存根
让startServer(_rootPath):异步=
异步的{
printfn“服务器已启动”
做!异步。睡眠500
返回“废话”
}
//要编译的示例代码的存根
类型Application()=类结束
类型App()=
继承应用程序()
让可变任务:System.Threading.Tasks.task=null
让rec startRestartable()=
//捕获异步以避免GC
任务异步.Catch
将服务器结果与
|选择1of2 x->
//也不例外?如果服务器正常终止,您会做什么
//我想你需要重新启动
//所有路径都会导致重新启动,此处不执行任何操作
printfn“服务器已完成?为什么?%A”x
()
|选择2of2 ex->
//日志异常,不良日志记录示例存根
eprintfn“服务器崩溃:%A”ex
startRestartable()
}
|>Async.startask
做
打印fn“开始”
startRestartable()