我有一个移动设备的嵌入式服务器,有时会崩溃。我需要始终让服务器活着。现在问题是我没有看到在异步时如何重启服务器:
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..
如何清理所有并重新启动服务器?
捕获异常,调用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()