(問題は解決しました)アクションにMVCアプリケーションがあります:
最初のケース: タスクが開始されていません。
public ActionResult Insert(NewsManagementModel model) {
//Do some stuff
//Insert history
//new object NewsHistoryDto as the parameter
Task.Factory.StartNew(() => InsertNewsHistory(new NewsHistoryDto {
UserId = 1234,
Time = DateTime.Now,
Id = 1234
}));
return RedirectToAction("Index", "NewsManagement");
}
2 番目のケース: タスクは正常に実行されます
public ActionResult Insert(NewsManagementModel model) {
//Do some stuff
//Insert history
//object NewsHistoryDto was declared outside
var history = new NewsHistoryDto {
UserId = 1234,
Time = DateTime.Now,
Id = 1234
};
Task.Factory.StartNew(() => InsertNewsHistory(history));
return RedirectToAction("Index", "NewsManagement");
}
私の質問は: Task.Factory.StartNew と私がそれにメソッドを入れるとき、そのメソッド (オブジェクト) のパラメータは外部で宣言する必要がありますか??? 最初のケースのように短く書くと、パラメーターに「new」キーワードを入れて、タスクが実行されないためです。理由: 実際には、できるだけ早くビューを返したいのですが、そのビューに関連しない他のものはタスクで実行され、クライアントは完了を待つ必要はありません。
私は私の悪い英語について非常に申し訳ありません:)
更新 1 : Panagiotis Kanavosに感謝します。QueueBackgroundWorkItemを使用しましたが、問題は同じです。オブジェクトを外部で宣言すると、このメソッドは正常に実行されます。しかし、パラメーター内で新しいキーワードを使用すると、このメソッドは実行されません。例外もエラーもありません。これがどのように可能かを誰かに説明してもらえますか:(
更新 2 : 私は 2 つのケースを試します:
初め:
HostingEnvironment.QueueBackgroundWorkItem(delegate {
var handler = m_bussinessHandler;
handler.InsertNewsHistoryAsync(new NewsHistoryDto {
UserId = UserModel.Current.UserId,
Time = DateTime.Now,
Id = newsId
});
});-> still doens't works
2番:
var history = new NewsHistoryDto {
UserId = UserModel.Current.UserId,
Time = DateTime.Now,
Id = newsId
};
HostingEnvironment.QueueBackgroundWorkItem(delegate {
var handler = m_bussinessHandler;
handler.InsertNewsHistoryAsync(history);
});-> works normally
では、ここで問題はどこにありますか?私がコピーしたので、それはm_bussinessHandlerについてではありません。
更新 3 : 理由がわかりました。理由は UserModel.Current です。これは のオブジェクトですHttpContext.Current.Session["UserModel"]
。この場合、非同期メソッドを呼び出すと、このメソッドが実際に実行されると、null である HttpContext.Current にアクセスできます。したがって、データを保存するオブジェクトを外部で宣言してメソッドに渡すか、UserModel.Current をキャプチャしてこのメソッドに渡して UserModel.Current.UserId を使用することで、この問題を解決できます。
私の問題は実際に解決しました。私を助けてくれた皆さん、特にPanagiotis Kanavosに感謝します。