2016-12-15 57 views
1

我想通過異步控制器執行導入過程,其中我聲明瞭一個任務,以便所有方法都可以訪問它,但是當任務過程完成時它將變爲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); 
    } 
} 

}

我怎樣才能做到這一點?

UPDATE 我試過用Hangfire來做到這一點,但這是不可能的。我的導入方法應該返回一個錯誤列表,而使用Hangfire則無法訪問運行的返回。

+2

爲什麼這些方法要訪問*任務*而不是結果?並不是他們*可以*。每個請求導致不同的控制器實例。如果你想創造一個長時間運行的工作,那不是做這件事的方法。 –

+1

檢查Scott Hanselman的[如何在ASP.NET中運行後臺任務](http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx)。它解釋了爲什麼你要求不起作用,如何用QueueBackgroundWorkItem正確啓動後臺任務,以及如何使用Hangfire實現預定作業 –

回答

0

ImportController的新實例在您每次發出請求時都會創建,因此非靜態的_myTask字段將在每個其他請求上初始化爲空值。

您可以通過使_myTask爲靜態或注入某種單一範圍的管理器類來跟蹤您的任務超出控制器範圍來解決此問題。

private static Task<ResultObject> _myTask; 

但是,在目前的狀態下,這將會非常脆弱。如果兩個不同的用戶啓動此任務會發生什麼?它應該運行兩次?如果因爲第二次啓動而失去第一次運行的軌跡?你接近這個問題的方式似乎很容易導致問題,我同意Panagiotis你可能應該使用不同的框架來觸發和跟蹤任務的狀態。

相關問題