帮我解决下一个问题。 我有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的应用程序池。应用程序中的所有任务都由几个进程处理。我控制导入状态的请求总是由不同的进程处理。它们有不同的静态变量。我想这是解决问题的正确方法。 但我不知道如何在一个地方合并所有静态值。
答案 0 :(得分:0)
不看代码,这是一个显而易见的问题。你确定你的访问是线程安全的(你是否正确使用锁来更新你的价值甚至访问它=> C# thread safety with get/set)?
代码示例可能不错。
感谢代码,似乎在读/写之前没有正确锁定CitiesSaving你应该隐藏属性后面的实例变量来处理所有的锁定。将此字段标记为易失性也可能有所帮助(请参阅http://msdn.microsoft.com/en-us/library/aa645755(v=vs.71).aspx)