2011-01-12 5 views
1

次の問題を解決するのに役立ちます。 私は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つの場所にマージする方法はわかりません。

+0

CitiesSavingをロックして、 – dvhh

答えて

0

コードを見ずに、明らかな質問があります。あなたのアクセスがスレッドセーフであることを確信していますか?(値を更新するために適切にロックを使用していますか?それともそれにアクセスする=>C# thread safety with get/set)?

コードサンプルがいいかもしれません。

CitiesSavingは読み書きの前に正しくロックされていないようですが、すべてのロックを処理するプロパティの後ろにインスタンス変数を隠す必要があります。このフィールドを揮発性とすると、http://msdn.microsoft.com/en-us/library/aa645755(v=vs.71).aspxを参照してください。

関連する問題