let runWithTimeout (timeout: int) (action: unit -> 'a) : 'a option =
let cts = new CancellationTokenSource(timeout)
try
let task = async { let! res = Task.Run(action, cts.Token)
return res }
Some(Async.RunSynchronously(task))
with :? OperationCanceledException -> None
But for Task.Run(action, cts.Token) :
Type constraint mismatch. The type 'Task<'a>' is not compatible with type 'Async<'b>'
It is best not to try to mix
AsyncwithTaskunless you know well what you are doing. In this case, you can implement the functionality very easily just using tasks. There are many options, but one nice approach is to useWhenAnyto choose between your action and a task that waits for a given time and then returnsNone: