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ページのライフサイクルを実行したスレッドはスレッド プールに返されます。さらに重要なことは、ページがレンダリングされて完成し、もう何も変更できないことです。

その後、おそらく 1 秒、おそらく 10 分後にFileSystemWatcher、イベントが生成されます。このページはかなり前にブラウザによってレンダリングされたものなので、 を呼び出すとどうなると思いますResponse.Redirectか? 応答は既にブラウザに送信されているため、何も起こりません。

さらに、これは最終的にメモリの問題を引き起こします。このページをリクエストするたびに、新しいFileSystemWatcherが作成されます。ウォッチャーは、イベントが発生したときにイベント ハンドラーを呼び出す必要があるため、ページへの参照を維持する必要があります。したがって、ページとウォッチャーの両方をガベージ コレクションすることはできません。したがって、このページをリクエストするたびに、ページとウォッチャーをインスタンス化します。このウォッチャーは、決して再利用されない少量のメモリを占有します。

于 2010-09-09T08:31:22.330 に答える
1

他の人が言ったように、あなたがしようとしていることは不可能です。ただし、次の方法で同様の効果を作成できます。

  1. Global.asaxのApplication_Startイベント内に新しいFileSystemWatcherを作成します。
  2. FileSystemWatcher OnChangeイベントの場合、必要な情報(LastChangeDateTimeなど)を含むオブジェクトでCache変数(つまり、Cache ["UploadedImagesChanged"])を更新するようにします。
  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 に答える