14

私は次のコードの平和を持っています:

IAsyncResult beginExecuteReader = command.BeginExecuteNonQuery();

while (!beginExecuteReader.IsCompleted)
{
    if (controllerTask.CancellationTokenSource.IsCancellationRequested)
    {
        command.Cancel();
    }

    Thread.Sleep(100);
}

try
{
    result = command.EndExecuteNonQuery(beginExecuteReader);
}
catch (SqlException exception)
{
    if (exception.ErrorCode == OperationCanceled)
    {
        throw new OperationCanceledException();
    }

    throw;
}

キャッチされた例外が操作のキャンセルによって発生したことを特定するにはどうすればよいですか。この場合、ExecuteNonQuery はエラー コード 0x80131904 で例外をスローしますが、これは非常に一般的な例外であり、さまざまな理由で発生する可能性があります。エラー メッセージは次のようになります: {"現在のコマンドで重大なエラーが発生しました。結果がある場合は破棄する必要があります。\r\n操作はユーザーによってキャンセルされました。"}

エラーメッセージの解析以外のオプションが表示されません...何かアイデアはありますか?

ありがとう

PS。ええ、.NET 2.0 では MSDN に警告がありましたが、.NET 4.0 ではこの警告が削除されたため、asyncronyc 操作の Cancel コマンドはおそらく最良のアイデアではないことを知っています。また、cancel メソッドが別のスレッドから呼び出されたときの別の実装も好きではありません。私にとっては、コードがより難しくなるからです。

4

3 に答える 3

-2

だから私はあなたが次にやるべきです:

  1. adoを使用するスレッドを作成します(このスレッドの例を読んでください)
  2. Thread.Sleep(100); を削除します。//私は決してそれを使用しません
  3. クラスに追加します static bool muststop=false;
  4. クラス public static 関数に追加して、「muststop」を変更します
  5. muststop==true の場合、スレッドの関数を変更してスレッドを停止します

これがお役に立てば幸いです

于 2012-04-19T11:22:15.017 に答える
-3

catch ブロックで例外メッセージを調べて、ユーザーによってキャンセルされた操作を見つけることができます。

try
{
   //your code
}
catch (SqlException ex)
{
  if (ex.Message.Contain("Operation cancelled by user"))
   {
       //Do something here
   }
}
于 2013-07-10T07:34:07.130 に答える