簡體   English   中英

開啟和關閉FileSystemWatcher以避免出現多個實例

[英]Switch FileSystemWatcher on and off to avoid multiple instances

Newbee警報。 問題:我填充了一個組合框,用戶進行了選擇。 然后,我創建並啟用FSW。 一切正常,直到用戶重新訪問組合框進行其他選擇。 此時,將實例化另一個FSW,從而導致基於“正在使用文件”錯誤的IO異常。 當用戶在組合框中進行后續選擇時,我需要關閉FSW(或破壞實例化)。 整個程序由帶有組合框的Winform驅動。

當用戶重新訪問組合框並進行其他選擇時,如何打開或關閉FSW或銷毀FSW實例並允許創建一個新的相似的實例?

要求實例化FSW的代碼:

        private void MinAndGo()
    {
        if (strLblPtr != null)
        {
            if(strLblPtr != "None")
            {
                if (!CheckMyPrinter(strLblPtr))
                {
                    MessageBox.Show(ForegroundWindow.Instance, "Printer is not ready. Make sure it's turned on "
                    + "and has paper loaded.", "Printer Not Ready");
                }
            }
            this.WindowState = FormWindowState.Minimized;
            this.Activate();
            bCreateWatcher = true;
            Watchit();
        }
    }

WatchIt()的代碼。 我打算使用bool bCreateWatcher來打開和關閉FSW。

private static void Watchit()
    {
        List<string> list = new List<string>();
        list.Add("C:\\SAMMS\\pcl");
        list.Add("C:\\SAMMS\\lbl");
        foreach (string my_path in list)
        {
            Watch(my_path);
        }
    }
    private static void Watch(string watch_folder)
    {

        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.InternalBufferSize = 8192; //defaults to 4KB, need 8KB buffer
        watcher.Path = watch_folder;
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
       | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        watcher.Filter = "*.*"; 
        watcher.Created += new FileSystemEventHandler(OnCreated);
        // Begin watching.
        try
        {
            if (bCreateWatcher)
            {
                watcher.EnableRaisingEvents = true;
            }
            else
            {
                watcher.EnableRaisingEvents = false;
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show(ForegroundWindow.Instance, "FSW not set correctly" + ex, "FSW Error");
        }
     }

FileSystemWatcher實現IDisposable 因此,您應該調用Dispose銷毀實例。

您可以在這里找到更多信息:

好的,看來您需要將監視程序存儲在某個地方,也許是在路徑上鍵入了字典? 您還需要擁有所有包含在實現IDisposable ,以便您可以在當前已打開該類的所有觀察者上正確調用Dispose() (然后,應確保也正確處置了包含類。)

我可以將Watch()重構為這樣(可能更好):

private static IDictionary<string, FileSystemWatcher> _openWatchers
    = new Dictionary<string, FileSystemWatcher>();

private static void Watch(string watch_folder)
{
    if (!bCreateWatcher)
    {
        if (_openWatchers.ContainsKey(watch_folder))
        {
            _openWatchers[watch_folder].Dispose();
            _openWatchers.Remove(watch_folder);
        }
        return;
    }

    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.InternalBufferSize = 8192; //defaults to 4KB, need 8KB buffer
    watcher.Path = watch_folder;
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
   | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    watcher.Filter = "*.*"; 
    watcher.Created += new FileSystemEventHandler(OnCreated);
    // Begin watching.
    try
    {
         watcher.EnableRaisingEvents = true;
         _openWatchers[watch_folder] = watcher;
    }
    catch(Exception ex)
    {
        MessageBox.Show(ForegroundWindow.Instance, "FSW not set correctly" + ex, "FSW Error");
    }
 }

和您的Dispose()方法:

 public void Dispose()
 {
     foreach (FileSystemWatcher fsw in _openWatchers.Values)
     {
          fsw.Dispose();
     }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM