Asynchronous 以F为单位运行超时的IO任务#

Asynchronous 以F为单位运行超时的IO任务#,asynchronous,f#,Asynchronous,F#,我正试图与F#的云服务部门进行沟通,并在这些操作中暂停 现在已经是多次迭代了,但我仍然不知道如何使用异步 let tokenSource = new CancellationTokenSource() let task = Async.StartAsTask(async {return (getS3Meta keyMeta)}, TaskCreationOptions.None, tokenSource.Token) let metaMaybe = As

我正试图与F#的云服务部门进行沟通,并在这些操作中暂停

现在已经是多次迭代了,但我仍然不知道如何使用异步

    let tokenSource = new CancellationTokenSource()
    let task        = Async.StartAsTask(async {return (getS3Meta keyMeta)}, TaskCreationOptions.None, tokenSource.Token)
    let metaMaybe   = Async.AwaitTask(task, 700) |> Async.RunSynchronously
为了支持我们引入的超时:

  type Timeout = Timeout

  type Microsoft.FSharp.Control.Async with

    static member AwaitTask (t : Task<'T>, timeout : int) =
        async {
            use cts = new CancellationTokenSource()
            use timer = Task.Delay (timeout, cts.Token)
            let! completed = Async.AwaitTask <| Task.WhenAny(t, timer)
            if completed = (t :> Task) then
                cts.Cancel ()
                let! result = Async.AwaitTask t
                return Ok result
            else return Error Timeout
        }
type Timeout=Timeout
键入Microsoft.FSharp.Control.Async with

静态成员等待任务(t:Task当前正在工作的代码(尽管我们不了解与不同异步工作流相关的不同权衡,但我们没有遇到这方面的问题)

一些金融服务机构:

> let ioFn () = Thread.Sleep(5000); System.Console.WriteLine 100; 100;;
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val ioFn : unit -> int

> ioFn();;
100
Real: 00:00:05.005, CPU: 00:00:00.001, GC gen0: 0, gen1: 0, gen2: 0
val it : int = 100

> let taskAsync = async { return ioFn() };;
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val taskAsync : Async<int>

> let t = Async.StartAsTask taskAsync ;;
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val t : Tasks.Task<int>

> t.Wait(500) ; t.Status;;
Real: 00:00:00.505, CPU: 00:00:00.001, GC gen0: 0, gen1: 0, gen2: 0
val it : Tasks.TaskStatus = WaitingForActivation

> 100

- t.Wait(500) ; t.Status;;
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val it : Tasks.TaskStatus = RanToCompletion

> t.Result;;
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val it : int = 100

不确定如何摆脱缓慢启动。

当前正在运行的代码(我们没有遇到这方面的问题,尽管我们不了解与不同异步工作流相关的不同权衡)

一些金融服务机构:

> let ioFn () = Thread.Sleep(5000); System.Console.WriteLine 100; 100;;
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val ioFn : unit -> int

> ioFn();;
100
Real: 00:00:05.005, CPU: 00:00:00.001, GC gen0: 0, gen1: 0, gen2: 0
val it : int = 100

> let taskAsync = async { return ioFn() };;
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val taskAsync : Async<int>

> let t = Async.StartAsTask taskAsync ;;
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val t : Tasks.Task<int>

> t.Wait(500) ; t.Status;;
Real: 00:00:00.505, CPU: 00:00:00.001, GC gen0: 0, gen1: 0, gen2: 0
val it : Tasks.TaskStatus = WaitingForActivation

> 100

- t.Wait(500) ; t.Status;;
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val it : Tasks.TaskStatus = RanToCompletion

> t.Result;;
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val it : int = 100

不知道如何摆脱缓慢的启动。

为什么这个标记为C#?在执行过程中的哪一点任务处于
等待激活
状态?我用
线程测试了这一点。Sleep
代替了实际的IO操作,我在
startask
调用之后立即得到
等待激活
状态,但是t然后任务开始(大概是在调度程序从任务池中拾取任务时)并按预期完成。或者您想以某种方式避免调度程序?Hi@TomasPetricek我在超时(500-700毫秒)后获得此状态。我正在处理一个项目,该项目要求异步任务的响应时间比此要快得多。理想情况下,我希望超时时间超过250ms。创建第一个任务时,似乎有一个初始的缓慢启动。之后它会快得多。为什么标记为C#?在执行过程中的哪一点是我要执行的任务在
WaitingForActivation
状态下?我用
线程测试了这一点。Sleep
代替了实际的IO操作,我在
startask
调用后立即得到了
WaitingForActivation
状态,但任务随后启动(大概是在调度程序从任务池中提取任务时)并按预期完成。或者你想以某种方式避免调度程序?Hi@TomasPetricek我在超时(500-700毫秒)后得到了这种状态。我正在处理一个项目,该项目要求异步任务的响应时间比此要快得多。理想情况下,我希望所有需要超过250ms的任务都超时。创建第一个任务时,初始启动似乎很慢。之后,启动速度会快得多。
Error: WaitingForActivation
Elapsed Time: 296
Error: WaitingForActivation
Elapsed Time: 254
Error: WaitingForActivation
Elapsed Time: 255
Error: WaitingForActivation
Elapsed Time: 254
Error: WaitingForActivation
Elapsed Time: 254
OK: RanToCompletion
Elapsed Time: 249
OK: RanToCompletion
Elapsed Time: 147
OK: RanToCompletion
Elapsed Time: 246
OK: RanToCompletion
Elapsed Time: 146
OK: RanToCompletion
Elapsed Time: 150
OK: RanToCompletion
Elapsed Time: 142
OK: RanToCompletion
Elapsed Time: 143
OK: RanToCompletion
Elapsed Time: 139
OK: RanToCompletion
Elapsed Time: 139
OK: RanToCompletion
Elapsed Time: 141