【问题标题】:Static variables and long running thread on IIS 7.5IIS 7.5 上的静态变量和长时间运行的线程
【发布时间】:2011-01-12 08:48:55
【问题描述】:

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

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

导入状态在静态变量中可用。新线程在工作开始时更改变量的值。 用户也可以借助视图中使用的此变量检查导入状态。并且用户可以看到导入的状态。 当我启动此功能几分钟时,一切正常。在页面上,我看到正确的导入状态,导入记录的数量发生了变化,我看到了日志中的变化。但几分钟后开始麻烦。 当我刷新具有导入状态的页面时,有时我会看到导入正常,但有时我会看到具有有关导入的默认值的页面(例如应用程序刚刚启动),但之后我再次可以看到具有正常导入状态的页面。 我试图将 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;
  }
}

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

【问题讨论】:

  • 你应该锁定 CitiesSaving 并可能使其不稳定

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


【解决方案1】:

不看代码,这里有一个明显的问题。您确定您的访问是线程安全的(也就是说您是否正确使用锁来更新您的值甚至访问它=> C# thread safety with get/set)?

一个代码示例可能会很好。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2010-10-06
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多