2017-03-31 98 views
0

我很努力地弄清楚如何在異步計算表達式中編寫Task.ContinueWith如何在異步計算表達式中編寫Task.ContinueWith

最終,我想處理取消而不依賴於取消例外。因此,我認爲我可以使用Task.ContinueWith

但是,我正在努力寫這篇文章。

有什麼建議嗎?

let rec receiveXmlMessage connection (cancellation:CancellationToken) queue = 

    async { 

     use receiveCommand = new SqlCommand(receiveQuery, connection, CommandTimeout = 0) 
     let result = receiveCommand.ExecuteNonQueryAsync(cancellation) 

     result.ContinueWith(fun (someResult:Task<int>) -> CancellableResult.Cancelled // IDK...) |> AsyncResult.fromAsync 
    } 

錯誤類型不匹配。期待一個 任務> - > 'B但給予 異步<' C> - >異步>類型 '任務>' 不匹配的類型「異步< 'B>'

回答

2

對不起,此ISN這不一定是答案,但不適合作爲評論。

您是否需要將取消令牌傳遞給您的工作流程?我想這可能是最好使用Async.CancellationToken傳播工作流的現有令牌:

async { 
    let! ct = Async.CancellationToken // gets the async workflow's current cancellation token 
    use receiveCommand = new SqlCommand(receiveQuery, connection, CommandTimeout = 0) 
    let! result = receiveCommand.ExecuteNonQueryAsync(ct) |> Async.AwaitTask 
    // do something with the result 
} 

通過通過對你所關心的,您就能取消的工作流程做正確的事的計算線程異步工作流的取消標記 - 它可以在從一個步驟轉換到另一個步驟時取消頂層工作流程,或者如果執行該操作,則可以取消查詢執行。

然後,當你時間表通過像Async.RunSynchronouslyAsync.Start您可以在現有的取消標記傳遞,如果你有一個方法,你的異步。

但是,由於您使用的是let rec,但是您沒有指出任何遞歸邏輯需求,所以我不完全清楚這是否是您實際嘗試執行的操作。