次の問題を解決するのに役立ちます。 私はASP .NET MVC2アプリケーションを持っています。 IIS 7.5で実行します。あるページでは、ユーザーがボタンをクリックし、このボタンのハンドラーがサーバー(jquery.ajax)に要求を送信します。コントローラ内のサーバーアクションで新しいスレッドが開始されます(長い時間のインポートが行われます)。IIS 7.5の静的変数と長時間実行スレッド
var thread = new Thread(RefreshCitiesInDatabase);
thread.Start();
インポートの状態は静的変数で使用できます。新しいスレッドは、作業の開始時に変数の値を変更します。 ユーザーは、ビューで使用されるこの変数の助けを借りて、インポートの状態をチェックすることもできます。ユーザーはインポートの状態を確認します。 この機能を数分起動すると、すべてが消えてしまいます。私は右のインポートの状態を参照してくださいページで、インポートされたレコードの数量が変更され、ログの変更が表示されます。しかし、数分後にトラブルが始まります。 インポート状態のページをリフレッシュするときに、インポートがokeyであることが表示されることがありますが、インポートに関するデフォルト値のページが表示されることがあります(アプリケーションの開始と同じですが)。 Visual StudioをIISのプロセスとデバッグアプリケーションに接続しようとしました。しかし、要求がコントローラに来ると、時々静的変数は正しい値を持ち、時にはデフォルト値(static intは0、静的文字列は ""など)を持ちます。 私が間違っていることを教えてください。私は他の方法で追加のスレッドを開始する必要がありますか?事前に
おかげで、 ドミトリー
私はコードの部分を追加します。 コントローラー:コアで
public class ImportCitiesController : Controller
{
[Dependency]
public SaveCities SaveCities { get; set; }
//Start import
public JsonResult StartCitiesImport()
{
//Methos in core dll, which makes import
SaveCities.StartCitiesSaving();
return Json("ok");
}
//Get Information about import
public ActionResult GetImportState()
{
var model = new ImportCityStatusModel
{ NowImportProcessing = SaveCities.CitiesSaving };
return View(model);
}
}
クラス:
public class SaveCities
{
// Property equals true, when program are saving to database
public static bool CitiesSaving = false;
public void StartCitiesSaving()
{
var thread = new Thread(RefreshCitiesInDatabase);
thread.Start();
}
private static void RefreshCitiesInDatabase()
{
CitiesSaving = true;
//Processing......
CitiesSaving = false;
}
}
UPDATE 私が思うに、私が見つかりました。問題は、それでも私はそれを解決する方法を知らない。私のIISは、パラメータ "Maximum Worker Processes" = 10を持つアプリケーションプールを使用します。アプリケーションのすべてのタスクは、わずかなプロセスで処理されます。そして、インポートの状態を制御する私の要求は、常に異なるプロセスによって処理されます。そしてそれらは異なる静的変数を持っています。私はそれが解決のための正しい方法だと思います。 しかし、静的な値を1つの場所にマージする方法はわかりません。
CitiesSavingをロックして、 – dvhh