Asynchronous 以F为单位运行超时的IO任务#
我正试图与F#的云服务部门进行沟通,并在这些操作中暂停 现在已经是多次迭代了,但我仍然不知道如何使用异步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
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