[解決済み] CancellationTokenプロパティを使用するには?
質問
前のコードと比較すると
RulyCanceler クラスの場合
を使ってコードを実行したかったのですが
CancellationTokenSource
.
にあるように、どのように使用すればよいのでしょうか?
キャンセルトークン
で述べたように、つまり例外をスロー/キャッチせずに使用するにはどうすればよいですか? また
IsCancellationRequested
プロパティを使用できますか?
このように使おうとしました。
cancelToken.ThrowIfCancellationRequested();
と
try
{
new Thread(() => Work(cancelSource.Token)).Start();
}
catch (OperationCanceledException)
{
Console.WriteLine("Canceled!");
}
でランタイムエラーが発生します。
cancelToken.ThrowIfCancellationRequested();
というメソッドで
Work(CancellationToken cancelToken)
:
System.OperationCanceledException was unhandled
Message=The operation was canceled.
Source=mscorlib
StackTrace:
at System.Threading.CancellationToken.ThrowIfCancellationRequested()
at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33
at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
正常に実行できたコードは、新しいスレッドでOperationCanceledExceptionを捕捉しています。
using System;
using System.Threading;
namespace _7CancellationTokens
{
internal class Token
{
private static void Main()
{
var cancelSource = new CancellationTokenSource();
new Thread(() =>
{
try
{
Work(cancelSource.Token); //).Start();
}
catch (OperationCanceledException)
{
Console.WriteLine("Canceled!");
}
}).Start();
Thread.Sleep(1000);
cancelSource.Cancel(); // Safely cancel worker.
Console.ReadLine();
}
private static void Work(CancellationToken cancelToken)
{
while (true)
{
Console.Write("345");
cancelToken.ThrowIfCancellationRequested();
}
}
}
}
どのように解決するのですか?
以下のように作業方法を実装することができます。
private static void Work(CancellationToken cancelToken)
{
while (true)
{
if(cancelToken.IsCancellationRequested)
{
return;
}
Console.Write("345");
}
}
以上です。キャンセル処理は必ず自分で行い、適切なタイミングでメソッドを終了させる必要があります(自分の作業やデータが一貫した状態になるように)。
UPDATEです。
私は
while (!cancelToken.IsCancellationRequested)
というのも、ループ本体で安全に実行を停止できる出口が少ないことが多く、ループには通常、終了するための論理的な条件(コレクション内の全項目を反復処理する、など)があるからです。そのため、これらの条件は異なる意図を持っているので、混在させない方が良いと思います。
を避けるための注意点
CancellationToken.ThrowIfCancellationRequested()
:
問題のコメント によって Eamon Nerbonne :
<ブロッククオート
...を置き換える
ThrowIfCancellationRequested
に対する多くのチェックで
IsCancellationRequested
は、この回答が言うように、優雅に終了します。しかし、これは単なる実装の詳細ではなく、観察可能な動作に影響します。タスクはもはやキャンセルされた状態で終了するのではなく
RanToCompletion
. そして、これは明示的な状態チェックだけでなく、より微妙なことですが、例えば、タスクチェーンで
ContinueWith
でのタスクチェインにも影響します。
TaskContinuationOptions
が使われます。私は、避けるべきは
ThrowIfCancellationRequested
は危険なアドバイスです。
関連
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み] 他のスレッドからGUIを更新するにはどうすればよいですか?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。