F# bounded worker pool collecting results

F#
open System.Threading
open System.Threading.Tasks

let runPool (workers: int) (jobs: (unit -> 'T) list) =
    use gate = new SemaphoreSlim(workers)
    let tasks =
        jobs |> List.map (fun job ->
            gate.Wait()
            Task.Run(fun () ->
                try
                    try Ok(job ()) with e -> Error e
                finally
                    gate.Release()))
    tasks |> List.map (fun t -> t.GetAwaiter().GetResult())