Статические переменные и длительный поток в IIS 7.5 - PullRequest
1 голос
/ 12 января 2011

Помогите мне решить следующую проблему.У меня есть приложение ASP .NET MVC2.Я запускаю его на IIS 7.5.На одной странице пользователь нажимает кнопку, и обработчик для этой кнопки отправляет запрос на сервер (jquery.ajax).При действии сервера в контроллере запускается новый поток (это делает длительный импорт):

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

Состояние импорта доступно в статической переменной.Новый поток меняет значение переменной в начале работы.Пользователь также может проверить состояние импорта с помощью этой переменной, которая используется в представлении.И пользователь видит состояние импорта.Когда я запускаю эту функцию несколько минут, все в порядке.На странице я вижу правильное состояние импорта, изменяется количество импортируемых записей, я вижу изменения в журналах.Но через несколько минут начинаются неприятности.Когда я обновляю страницу с состоянием импорта, иногда я вижу, что импорт работает нормально, но иногда я вижу страницу со значениями по умолчанию для импорта (например, приложение только что запущено), но после этого я снова вижу страницу с нормальным состоянием импорта.Я пытался подключить 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);
  }
}

Класс в Core:

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. И все задачи в приложении обрабатываются несколькими процессами.И мой запрос на контроль состояния импорта всегда обрабатывается разными процессами.И у них разные статические переменные.Я думаю, что это правильный путь для решения.Но я не знаю, как объединить все статические значения в одном месте.

1 Ответ

0 голосов
/ 12 января 2011

Не глядя на код, вот очевидный вопрос.Вы уверены, что ваш доступ является потокобезопасным (то есть правильно ли вы используете блокировку для обновления своего значения или даже для доступа к нему => Безопасность потока C # с get / set )?

Пример кодаможет быть неплохо.

спасибо за код, кажется, что CitiesSaving не заблокирован должным образом перед чтением / записью, вы должны скрыть переменную экземпляра за свойством для обработки всей блокировки.Помогает также пометить это поле как изменчивое (см. http://msdn.microsoft.com/en-us/library/aa645755(v=vs.71).aspx)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...