ASP.net Response.Redirect для события FileSystemWatcher - PullRequest
2 голосов
/ 09 сентября 2010

Мне не удается использовать Response.Redirect (или Response.Write) для нового события FileSystemWatcher.

protected void Page_Load(object sender, EventArgs e)
{
   RunFolderListener();
}

private void RunFolderListener()
{
        FileSystemWatcher fsw = new FileSystemWatcher();
        fsw.Path = Server.MapPath("~/uploaded_images/");
        fsw.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite |
                           NotifyFilters.DirectoryName | NotifyFilters.FileName;
        fsw.Changed += new FileSystemEventHandler(OnChanged);
        fsw.EnableRaisingEvents = true;
}

    private void OnChanged(object source, FileSystemEventArgs e)
    {
        Response.Redirect(....); //not working
        Response.Write (....);//not working

    }

Ответы [ 3 ]

4 голосов
/ 09 сентября 2010

То, что вы хотите, невозможно.События FileSystemWatcher обрабатываются другим потоком, чем поток страницы.Чтобы проиллюстрировать это:

Page thread: |-Page_Load----...----Page_Unload-|
                 |-Start FSW
FSW thread :     |-----------------------------...--------FSW.OnChanged(...)---|

Где-то внутри Page_Load запускается FileSystemWatcher.Жизненный цикл страницы заканчивается Page_UnLoad, и поток, запустивший жизненный цикл страницы, возвращается в пул потоков.И что еще более важно, страница визуализируется и завершается, и ничто больше не может быть изменено.

В какой-то более поздний момент времени, возможно, через одну секунду, может быть, через десять минут FileSystemWatcher генерирует событие.Страница была обработана браузером очень давно, так что, по вашему мнению, должно произойти, когда вы звоните Response.Redirect?Поскольку ответ уже был отправлен в браузер, ничего не произойдет.

Кроме того, это в конечном итоге приведет к проблемам с памятью.Каждый раз, когда вы запрашиваете эту страницу, создается новый FileSystemWatcher.Наблюдатель должен поддерживать ссылку на страницу, потому что он должен вызывать обработчик события, когда происходит событие.Поэтому и страница, и наблюдатель не могут быть собраны мусором.Поэтому каждый раз, когда вы запрашиваете эту страницу, вы создаете экземпляр страницы и средства наблюдения, которые занимают небольшой объем памяти, который никогда не восстанавливается.

1 голос
/ 09 сентября 2010

Как уже упоминали другие, то, что вы хотите сделать, невозможно. Тем не менее, вы можете создать похожий эффект:

  1. Создайте новый FileSystemWatcher в событии Application_Start вашего Global.asax.
  2. Для события FileSystemWatcher OnChange обновите переменную Cache (например, Cache ["UploadedImagesChanged"]) объектом, содержащим необходимую информацию (например, LastChangeDateTime).
  3. На странице ASPX добавьте скрытое значение для хранения метки времени для данных на странице (например, HiddenField_LastUpdated.Value = DateTime.Now.ToString ()).
  4. В вашей Page_Load сравните текущий HiddenField_LastUpdated с Cache ["UploadedImagesChanged"] LastChangeDateTime. Если дата в кэше новее, Response.Rirectirect пользователь.

Можно также добавить на страницу таймер asp: Timer и некоторые панели обновлений, если вы хотите, чтобы страница опрашивала сервер для проверки обновлений.

0 голосов
/ 09 сентября 2010

Боюсь, что это не сработает - ваше событие отслеживания папок не является частью жизненного цикла страницы - обычно вам нужно запустить какой-то другой поток или задачу для обработки FSW, а затем сохранить свое состояние где-нибудь , Тогда вы можете сказать

protected void Page_Load(object sender, EventArgs e)
{
   if (myState.FileIngested) {
      Response.Redirect(....);
      Response.End();
   }
}

Надеюсь, что поможет

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