3

我有一个用于移动设备的嵌入服务器,有时可能会崩溃。我需要始终让服务器处于活动状态。现在的问题是我看不到异步时如何重新启动服务器:

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..

如何清理所有并重新启动服务器?

4

1 回答 1

1

捕获异常,像这样调用 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()
于 2019-02-19T16:07:35.853 回答