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()