【发布时间】: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