0

私はMVC3の初心者です。私のプロジェクトMVC3では、Excelシートをデータベースにインポートするためにスレッドを使用していますが、完全に機能します。次のことに疑問があります。1) CancellationToken を使用してスレッドを停止するには?? -- 私の MVC# フォームには、次のようなものがあります。それぞれ [キャンセル] と [インポート] という名前の 2 つのボタンがあります。2)[インポート]ボタンでイベントを送信すると、次のコードがあります。

    //Button Click on Import
    [HttpPost]
    public ActionResult FinalImport(FormCollection collection)
      {
            Task.Factory.StartNew(() =>
            { 
               //My Coding To Import

            } , tokenSource.Token);

            return null;
      }

    CancellationTokenSource tokenSource=new CancellationTokenSource();

    //Button Click on Cancel 
    public void CancelToken()
    {
        tokenSource.Token.ThrowIfCancellationRequested();
        tokenSource.Cancel();
      //  return null;
    }

注: [インポート] ボタンをクリックし、[タスクの実行中] をクリックして [キャンセル] ボタンをクリックしても、何も起こりません.. スレッド プロセスの実行をキャンセルする方法。これを達成するのを手伝ってください...

4

2 に答える 2

3

Web は本質的にステートレスな環境であるため、キャンセル トークンをある要求から別の要求に永続化する何らかの方法が必要です。FinalImport メソッドと CancelToken メソッドは別のリクエストです。アプリケーションは、以前のリクエストを一度も見たことがないかのように、それぞれをまったく新しいものとして扱います。ステートフルな環境で実行されているかのようにコードを記述しています。

以下はあなたのために働くかもしれません。

大まかな手順は次のとおりです。

  • FinalImport メソッドで tokenSource を作成します。
  • 要求を永続化する一意のキーを使用して、トークン ソースをディクショナリに追加します。(アプリケーション全体でグローバルになるように、静的として宣言されているとします)。
  • キーをブラウザに戻します。

ユーザーがブラウザでキャンセル ボタンを押すと、次のようになります。

  • ブラウザにリクエストでキーを送信させます。
  • CancelToken で、ブラウザがリクエストで送信するキーを使用して辞書を検索します。
  • ディクショナリの tokenSource を使用して、タスクをキャンセルします。
  • 辞書からトークンを削除します。

また、タスクの最後に、辞書からトークンを削除する必要があります (そうしないと、メモリが不足するまでトークンがどんどん増えていきます)

なんらかの理由で Web アプリケーションを実行するプロセスが失敗し、IIS がプロセスを再起動する必要がある場合、辞書は失われます。IIS は、メモリ不足などのさまざまな理由 (たとえば、メモリ リークが発生した可能性があり、新しいプロセスを作成する)、または最後に再起動してから 29 時間経過したため、プロセスを再起動します。いくらでもあるから。Web ガーデンまたは Web ファームを実行している場合、要求ごとに同じプロセスに戻ることが保証されないため、ディクショナリを使用できない場合があります。

これがコードの解決策ではないことは承知していますが、これが問題のドメインをよりよく理解するのに役立つことを願っています。

于 2013-05-03T23:32:28.570 に答える
0

最後に、解決策を見つけました。

1) CancellationTokenSource を静的として初期化する必要があります。

2) CancelToken メソッド
呼び出しで CancellationTokenSource オブジェクト tokensource を破棄する必要があります。

public static CancellationTokenSource tokenSource; 

[HttpPost]
    public ActionResult FinalImport(FormCollection collection)
      {
            tokensource=new CancellationTokenSource();
            Task.Factory.StartNew(() =>
            { 
                 if (ts.IsCancellationRequested)
                            {
                                break;
                            }
               //My Coding To Import

            } , tokenSource.Token);

            return null;
      }



    //Button Click on Cancel 
    public void CancelToken()
    {

        tokenSource.Cancel();
        tokensource.Dispose();
    }

それだけです..ハッピーコーディング....!!!!

于 2013-05-07T09:28:16.903 に答える