F#运行任务并等待完成而不会抛出错误

时间:2017-05-05 00:27:42

标签: azure f#

我尝试运行任务以通过F#在Azure中保存文档,并且我希望能够让任务抛出的任何异常不会立即抛出调用线程,而是使用Task对象查看是否有错误并妥善处理。

let update (c : CoolObjectName) =
    let uri = documentUri c.id
    let t = client.ReplaceDocumentAsync(uri, c)
            |> Async.AwaitTask
            |> Async.StartAsTask

如果出现此错误,则会立即抛出该错误。

我不确定Async.StartAsTask是否在等待任何事情。我不完全确定这里有什么点,如果有的话,我实际上在等待任务完成。 t此处的类型为Task<SomeAzureThing>。我后来检查它是否有故障,但这并不能保证它不会失败。

我不需要响应对象,如果Task失败,我只需要错误消息。

可以Async.RunSynchronously,但这会导致在调用线程上抛出任何异常。我已尝试使用t.Wait(),但Wait()会抛出遇到的任何异常。

修改

关于转换到/来自任务&amp;异步。这不是一个有意的设计决定,但我试图找到一个方法,我有办法(1)检索函数调用的结果或(2)知道函数调用错误而不实际抛出该错误。我知道如何做到这一点的最好方法是通过任务。如果我不做这种不必要的转换,我最终会得到Async<Choice<int,exn>>

let t = client.ReplaceDocumentAsync(uri, c)
               |> Async.AwaitTask
               |> Async.Catch

我似乎没有办法去&#34;得到&#34;没有Async.RunSynchronously的捕获的结果,它会引发异常。

1 个答案:

答案 0 :(得分:0)

或许Async.Catch (link)是您想要的功能吗?

  

创建执行指定的异步计算   计算。如果此计算成功完成,那么这个   方法返回Choice1Of2返回的值。如果这个计算   在完成之前引发异常,然后返回Choice2Of2   引发的例外。