2011-01-12 200 views
1

長時間運行的線程幫我解決下一個問題。 我有ASP .NET MVC2應用程序。我在IIS 7.5上運行它。在一個頁面中,用戶單擊此按鈕的按鈕和處理程序將請求發送到服務器(jquery.ajax)。在控制器服務器操作將啓動新的線程(這使得很長一段時間進口):靜態變量和IIS 7.5

var thread = new Thread(RefreshCitiesInDatabase); 
thread.Start(); 

進口國是在靜態變量可用。新線程在工作開始時更改變量的值。 用戶也可以藉助此變量來查看導入狀態,該變量用於查看。用戶看到導入的狀態。 當我幾分鐘開始這個功能時,一切都是okey。在頁面上我看到正確的導入狀態,導入記錄的數量發生了變化,我看到日誌中的更改。但幾分鐘後開始麻煩。 當我刷新與進口狀態頁面有時我看到進口的好,但有時我看到頁面的默認值約爲進口(如應用程序剛啓動時),但在那之後我又可以看到正常進口的狀態頁面。 我試圖將Visual Studio附加到IIS進程和調試應用程序。但是,當請求到達控制器時,有時靜態變量有正確的值,有時它們有默認值(靜態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。應用程序中的所有任務都由少量進程處理。而且我對控制進口狀態的請求總是由不同的進程處理。他們有不同的靜態變量。我想這是解決問題的正確方法。 但我不知道如何合併一個地方的所有靜態值。

+0

時,應該鎖定CitiesSaving,可能使其揮發到 – dvhh 2011-01-12 09:51:03

回答

0

不看代碼,這裏有一個明顯的問題。你確定你的訪問是線程安全的(這是你正確使用鎖來更新你的價值,甚至訪問它=>C# thread safety with get/set)?

一個代碼示例可能是不錯的。

感謝您的代碼,它似乎CitiesSaving未鎖定正確的讀/寫,你應該隱藏屬性後面的實例變量來處理所有鎖定之前。標記此字段作爲揮發還有助於(見http://msdn.microsoft.com/en-us/library/aa645755(v=vs.71).aspx