IIS 7.5上的静态变量和长时间运行的线程

时间:2011-01-12 08:48:55

标签: asp.net asp.net-mvc iis

帮我解决下一个问题。 我有ASP .NET MVC2应用程序。我在IIS 7.5上运行它。在一个页面中,用户单击按钮,此按钮的处理程序将请求发送到服务器(jquery.ajax)。在控制器中的服务器操作中启动新线程(它会导致长时间导入):

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;
  }
}

更新 我想,我发现了问题,但我仍然不知道如何解决它。我的IIS使用带有参数“Maximum Worker Processes”= 10的应用程序池。应用程序中的所有任务都由几个进程处理。我控制导入状态的请求总是由不同的进程处理。它们有不同的静态变量。我想这是解决问题的正确方法。 但我不知道如何在一个地方合并所有静态值。

1 个答案:

答案 0 :(得分:0)

不看代码,这是一个显而易见的问题。你确定你的访问是线程安全的(你是否正确使用锁来更新你的价值甚至访问它=> C# thread safety with get/set)?

代码示例可能不错。

感谢代码,似乎在读/写之前没有正确锁定CitiesSaving你应该隐藏属性后面的实例变量来处理所有的锁定。将此字段标记为易失性也可能有所帮助(请参阅http://msdn.microsoft.com/en-us/library/aa645755(v=vs.71).aspx