0

(問題は解決しました)アクションに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に感謝します。

4

2 に答える 2

0

あなたm_bussinessHandlerはインスタンスフィールドですか?アクションを終了した後に破棄される可能性があるためです。

于 2015-03-10T08:15:25.067 に答える