問題タブ [cancellationtokensource]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Task.Run のタイムアウトに CancellationToken を使用しても機能しない
わかりました、私の質問は本当に簡単です。このコードがスローしないのはなぜTaskCancelledException
ですか?
しかし、これは機能します
c# - 非同期読み取りのキャンセル タイムアウトを実装する AsTask が存在しない
タイムアウト機能を自分に追加したいと思ってstream.ReadAsync()
おり、この記事Async Cancellation: Bridging between the .NET Framework and the Windows Runtime (C# and Visual Basic) のMicrosoft ヘルプを読んでください。この記事では、AsTask()
これを実現するために使用することを提案しています。ただし、私のC#はまったく認識していないようですAsTask()
。
私はWindows 7でVisual Studio 2013を使用していますが、これは私が持っているコードです:using System.Threading;
ここで私が見逃しているものは何ですか。私は困惑しています:)
更新: これらはインストールされている .NET パッケージのリストです。Visual Studio 2013 は 4.5 を使用していると思います。
c# - CancellationToken.Register コールバック例外をどのようにキャッチしますか?
非同期 I/O を使用して HID デバイスと通信していますが、タイムアウトが発生したときにキャッチ可能な例外をスローしたいと考えています。次の読み取り方法があります。
トークンのコールバックからスローされた例外は、try/catch ブロックによってキャッチされず、その理由はわかりません。私はそれが待機中にスローされると思っていましたが、そうではありません。この例外をキャッチする (または Read() の呼び出し元がキャッチできるようにする) 方法はありますか?
編集: msdnで ドキュメントを読み直したところ、「デリゲートが生成した例外は、このメソッド呼び出しから伝播されます」と書かれています。
.Register() 呼び出しを try ブロックに移動しても、例外はまだキャッチされないため、「このメソッド呼び出しから伝搬された」とはどういう意味かわかりません。
c# - トークンのキャンセル中に InvalidOperationException が発生する
関数に canceltoken を渡す際に問題が発生しました。InvalidOperationException 、「別のスレッドに属しているため、呼び出しスレッドはオブジェクトへのアクセス許可を取得できません」を取得します。
これが私のコードです。
このエラーでこの問題を解決する方法を知っている人はいますか?
c# - Task.RunSynchronously() は CancellationToken を気にしません
現在のスレッドでサードパーティ関数を実行したい (オーバーヘッドを避けるため) が、CancellationTokenを使用していつでも関数を中断できるようにしたい。
それが私がタスクを作成して実行する方法です:
cts.Cancel()
(別のスレッドで)呼び出された後、タスクは停止しません。
F# でトリックを実行する静的関数を見つけました。
簡単な C# ソリューションがあるはずだと確信しています。助けてもらえますか?
c# - Parallel.ForEach CancellationTokenSource が停止しない
現在、ProxyChecker ライブラリを作成しています。Parallel.ForEach ループを実行してすべてのプロキシをチェックする Thread を使用しています。(cts) を使用しCancellationTokenSource
てソフト アボート (with cts.Cancel()
) を作成しています。次のコードでわかるように、現在のスレッドをコンソールに書き込む小さな「テスト コード」を追加しました。
必要なコードは次のとおりです。
出力(完全なコードを提供するのは無意味なので、数行を取り出しました)
そして、4、3、または 2 (毎回異なります) で停止します。数分待ちましたが、Parallel.ForEach が実行された後のコードもダウンしませんでした。
リクエストのタイムアウトは 5000 で、スレッドは 50 です。
チェック用の他のコードは次のとおりです。
停止機能:
重要な編集:
これを CeckProxy 関数に追加しました。
これは、最後のいくつかのスレッドの結果です。
なぜこれが長いのですか?つまり180秒?
c# - CancellationToken を使用した SQL Server クエリのキャンセル
SQL Server に実行時間の長いストアド プロシージャがあり、ユーザーがキャンセルできるようにする必要があります。SqlCommand.Cancel()
メソッドが非常にうまく機能することを示す次のような小さなテストアプリを作成しました。
を呼び出すとcmd.Cancel()
、基になるストアド プロシージャの実行が実質的に即座に停止することを確認できます。アプリケーションで async/await パターンをかなり頻繁に使用することを考えると、そのSqlCommand
パラメーターの非同期メソッドがCancellationToken
同様にうまく機能することを期待していました。残念ながら、 を呼び出すCancel()
とCancellationToken
、InfoMessage
イベント ハンドラーが呼び出されなくなりましたが、基になるストアド プロシージャは引き続き実行されることがわかりました。非同期バージョンのテスト コードは次のとおりです。
CancellationToken
がどのように機能するはずなのか、何かが欠けていますか? 問題が発生した場合に備えて、.NET 4.5.1 と SQL Server 2012 を使用しています。
編集:同期コンテキストが要因であり、同じ動作が見られる場合に備えて、テストアプリをコンソールアプリとして書き直しました-の呼び出しはCancellationTokenSource.Cancel()
、基になるストアドプロシージャの実行を停止しません。
編集:これは、重要な場合に呼び出すストアド プロシージャの本体です。レコードを挿入し、結果を 1 秒間隔で印刷して、キャンセルの試行がすぐに有効になったかどうかを簡単に確認できるようにします。
c# - Task.Factory.FromAsync と CancellationTokenSource
NetworkStream から非同期的に読み取るために使用される次のコード行があります。
キャンセル対応にしてほしいです。CancellationTokenSource を使用してタスクをキャンセルできることがわかりましたが、それをTaskFactory.FromAsync()に渡す方法がわかりません。
FromAsync() で構築されたタスク サポートのキャンセルを行うことは可能ですか?
編集:すでに実行中のタスクをキャンセルしたい。