2017-03-31 7 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 { 
    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.CancellationTokenを使用する方が良いかもしれないと思います1つのステップから別のステップに移行するときに最上位のワークフローをキャンセルすることができます。実行している場合はクエリの実行をキャンセルすることができます。その後

ときあなたは1を持っている場合は、既存のキャンセルトークンを渡すことができAsync.RunSynchronouslyAsync.Startなどの方法を通じて、あなたスケジュールあなたの非同期。

let recを使用していますが、再帰的なロジックが必要ないことを示しているので、これが実際に実行しようとしているのかどうかは完全にはわかりません。

関連する問題