2

我没有设法在新的 FileSystemWatcher 事件上使用 Response.Redirect(或 Response.Write)。

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

    }
4

3 回答 3

4

你想要的是不可能的。这些FileSystemWatcher事件由与页面线程不同的线程处理。为了说明这一点:

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

里面Page_Load的某个地方FileSystemWatcher开始了。页面生命周期以 a 结束Page_UnLoad,运行页面生命周期的线程返回到线程池。更重要的是,页面已渲染并完成,并且无法再更改任何内容。

在稍后的某个时刻,也许一秒钟,也许十分钟,FileSystemWatcher生成一个事件。页面很久以前就已经被浏览器渲染过了,那么你觉得调用的时候应该怎么做Response.Redirect呢?由于响应已经发送到浏览器,所以什么都不会发生。

此外,这最终会产生内存问题。每次您请求此页面时,FileSystemWatcher都会创建一个新页面。观察者必须维护对页面的引用,因为它必须在事件发生时调用事件处理程序。因此,页面和观察者都不能被垃圾收集。所以每次你请求这个页面时,你都会实例化这个页面和一个占用少量内存的观察者,这些内存永远不会被回收。

于 2010-09-09T08:31:22.330 回答
1

正如其他人所提到的,您想要做的事情是不可能的。但是,您可以通过以下方式创建类似的效果:

  1. 在 Global.asax 的 Application_Start 事件中创建一个新的 FileSystemWatcher。
  2. 对于 FileSystemWatcher OnChange 事件,让它更新一个缓存变量(即 Cache["UploadedImagesChanged"] 与包含您需要的信息的对象(即 LastChangeDateTime)。
  3. 在您的 ASPX 页面上,添加一个隐藏值来保存页面内数据的时间戳(即 HiddenField_LastUpdated.Value=DateTime.Now.ToString())。
  4. 在您的 Page_Load 中,将当前的 HiddenField_LastUpdated 与 Cache["UploadedImagesChanged"] LastChangeDateTime 进行比较。如果缓存日期较新,则 Response.Redirect 用户。

如果您希望页面轮询服务器以检查更新,您还可以考虑将 asp:Timer 添加到页面和一些更新面板。

于 2010-09-09T15:35:43.793 回答
0

恐怕这是行不通的——你的文件夹观察者事件不是页面生命周期的一部分——你通常会运行一些其他线程或任务来处理 FSW,然后将你的状态保持在某个地方。然后你可以说

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

希望有帮助

于 2010-09-09T08:14:06.477 回答