繁体   English   中英

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

[英]Static variables and long running thread on IIS 7.5

帮我解决下一个问题。 我有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使用参数“ Maximum Worker Processes” = 10的应用程序池。应用程序中的所有任务都由几个进程处理。 我要求控制进口状态的请求始终由不同的流程处理。 它们具有不同的静态变量。 我想这是解决问题的正确方法。 但是我不知道如何将所有静态值合并到一个地方。

不看代码,这是显而易见的问题。 您确定访问权限是线程安全的(也就是说,您是否正确使用锁来更新值,甚至使用get / set访问它=> C#线程安全 )?

代码示例可能很好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM