2011-01-12 199 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