I was pretty comfortable with how async cancellations where done in C# with the TPL, but I am a little bit confused in F#. Apparently by calling Async.CancelDefaultTok
There are two things about the question:
First, when a cancellation happens in F#, the AwaitTask
does not return null
, but instead, the task throws OperationCanceledException
exception. So, you do not get back None
value, but instead, you get an exception (and then F# also runs your finally
block).
The confusing thing is that cancellation is a special kind of exception that cannot be handled in user code inside the async
block - once your computation is cancelled, it cannot be un-cancelled and it will always stop (you can do cleanup in finally
). You can workaround this (see this SO answer) but it might cause unexpected things.
Second, I would not use default cancellation token - that's shared by all async workflows and so it might do unexpected things. You can instead use Async.CancellationToken
which gives you access to a current cancellation token (which F# automatically propagates for you - so you do not have to pass it around by hand as you do in C#).
EDIT: Clarified how F# async handles cancellation exceptions.