2012-03-27 10 views
0

私は、関数を実行している非同期タスクを持っています。この関数にはループ文は含まれていませんが、SQL Server上で一連のSQLコマンドが実行されています。今、私はこれらのSQL操作を取り消すことができる私のウィンドウ上のボタンがあります。つまり、非同期タスク全体をキャンセルします。ループベースのステートメントを実行していないタスクをキャンセルする方法

このテクニックではCancellationTokenSourceとCancellationTokenがタスクをキャンセルする必要があることは知っていますが、インターネット上で多くの例を見てきましたが、そのタスクが実行している関数には、ブール値プロパティの場合はIsCancellationRequestedです。しかし、私の場合はそうではありません。私の関数には、このブール値のプロパティのチェックを行うことができるループ文はありません。

どのような方法や手法を提案してください。

すべてのヘルプは非常にかなりの量になる...

事前にありがとう...

+0

完了したコマンドをキャンセルしたときにそれらのコマンドがトランザクションに含まれていない場合、私はそれらがロールバックされないと信じています。なぜユーザーはキャンセルするのですか?これが長時間実行されるタスクの場合は、BackGroundWorker with Progressを検討して、処理されたSQL文の数をレポートできます。 – Paparazzi

+0

@Blam、おそらくそれらは 'SELECT'なので、それらをロールバックすることは重要ではありませんか? – svick

答えて

1

まあ、たった3つの基本的なプログラムの流れは本当にありますシーケンス(ステップ1、ステップ2など)、選択(if-typeステートメント)と反復(ループ)があります。

ループがない場合、残っているのは選択とシーケンスだけです。それはあなたのコードは、おそらく(明らかに、擬似コード)のようなものを探して終わるために起こっていること:つまり

perform sql (statement1) 
if IsCancellationRequested: return 

perform sql (statement2) 
if IsCancellationRequested: return 
: 
: 
perform sql (statementN) 
if IsCancellationRequested: return 

、ループせずに、それは多くのと呼ばれるチェックを入れて単一の便利な場所はありませんあなたは何度もそれを自分のことと呼ぶ必要があります。それが呼び出される回数の点で、それをループで呼び出すことと実際の違いはありません。


あなたの問題は、あなたのソースコード全体浴びせように多くのチェックのアイデアを好きではないということであれば、あなたはあなたのためにそれを行うための関数を作成することができ、のようなもの:

def execSql (sqlStatement): 
    perform sql (sqlStatement) 
    return IsCancellationRequested 

その後、あなたの行は次のようになります。

if (perform sql (statement1)): return 
if (perform sql (statement2)): return 
: 
if (perform sql (statementN)): return 

今、あなたはおそらくいくつかの並べ替えや、その道のコレクションにステートメントを置くことによってループを追加することができ、あなた'LL 1つのチェック/リターンをコードするだけです。しかし、それは今あなたが今やっているやり方のより大きな変化を意味します。

0

コードに必要なときはいつでもチェックしてください。あなたの例(あなたが見たもの)が持っているので、各反復でキャンセルをチェックします。あなたのために持っていないので、あなたは手動でそれをキャンセルするかどうかをチェックするかどうかを選択する必要があります。あなたはクエリーを持っているので、おそらく各クエリーの後に、または2,3のクエリーごとに。あなたがそれを必要とするとき。

+0

@ gbianchi ...事は、ユーザーがボタンをクリックして、いつでもタスクをキャンセルできることを見てください。だから、すべての行の後にチェックを保つ、私はそれが思慮深い考えだと思う... – Uday0119

+0

まあ..建設のためにすべての行の後にチェックしている;)しかし、あなたはそれを一度書く:) – gbianchi

0

簡単な例(あなたが好きなようにあなたはそれを拡張することができます):あなたの代わりList<string>List<Func<..>>List<Action<..>>を使用したり、クエリ、ビルダー、ファクトリメソッドの設計パターンを考え出すことができるより良い経験のために

List<string> _sqls = new List<string>(); 
_sqls.Add("Select ... "); 
_sqls.Add("Update ... "); 
_sqls.Add("Select ... "); 

foreach (var sql in _sqls) 
{ 
    Execute(sql); 
    if (IsCancellationRequested) 
    { 
     // Make some rollback 
     return; 
    } 
} 

関連する問題