2016-12-15 6 views
1

すべてのメソッドがアクセスできるようにタスクを宣言したAsyncコントローラでインポートプロセスを実行しようとしていますが、タスクプロセスが終了するとnullになります私は別の方法からの情報を見ることができません。複数のメソッド(アクション)から同じタスクにアクセス

[SessionState(SessionStateBehavior.Disabled)] 
public class ImportController : AsyncController 
{ 
private Task<ResultObject> _myTask; 

public ActionResult Import() 
{ 
    _myTask = Task.Run(() => { 
     //failed or Success 
     return new ResultObject(); 
    }); 

    _myTask.Wait(); 

    return Json(new { success : _myTask.Result }); 
} 

public ActionResult CheckImportProcess() 
{ 
    //here _myTask is Null 
    if(_myTask.Status == TaskStatus.Running){ 
     return Content("IS RUNNIN"); 
    } 
    else{ 
     return Content(_myTask.Result); 
    } 
} 

}

私はこれをどのように行うことができますか?

更新 これを行うにはハングファイアを使用しようとしましたが、できませんでした。私のインポートメソッドはエラーのリストを返し、Hangfireでは実行の戻り値にアクセスすることはできません。

+2

なぜメソッドは結果の代わりに*タスク*にアクセスする必要がありますか?彼らは*できる*ではありません。各リクエストは、異なるコントローラインスタンスになります。長時間実行しているジョブを作成したい場合は、それを行う方法ではありません。 –

+1

Scott Hanselmanの[ASP.NETでのバックグラウンドタスクの実行方法](http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx)を参照してください。なぜあなたが聞いたことがうまくいかないのか、QueueBackgroundWorkItemを使ってバックグラウンドタスクを正しく開始する方法、そしてスケジュールされたジョブを実装する方法を説明します。例えば、Hangfire –

答えて

0

新しいインスタンスImportControllerがリクエストを作成するたびに作成されるため、非スタティックの_myTaskフィールドは、他の各リクエストでNULL値に初期化されます。

これを修正するには、_myTaskを静的にするか、何らかのシングルトンスコープマネージャークラスを挿入して、コントローラーの範囲外のタスクを追跡します。

private static Task<ResultObject> _myTask; 

しかし、これは現在の状態で非常に脆くなるでしょう。 2人の異なるユーザーがこのタスクを開始するとどうなりますか?それは2回実行する必要がありますか?あなたは、第2のものが始まったので最初の走路を失うべきですか?あなたがこの問題に近づいている方法は問題を引き起こす可能性が非常に高いようですが、私はPanagiotisには、おそらく別のフレームワークを使用してタスクの発射と追跡を行うべきであることに同意します。

関連する問題