【问题标题】:How to reduce the number of Balloon如何减少气球的数量
【发布时间】:2016-06-29 12:39:56
【问题描述】:

我有一个目录和一个 FileSystemWatcher,我想在每次删除文件时减少 Balloon.Show 的数量,但我该怎么做?因为每次我删除像 20 个文件 explorer.exe 崩溃的原因太 ShowBalloonTips。 我在这个论坛中找到了一个解决方案,如果我一个一个地删除文件,它会起作用,但是如果我将它们全部删除,它就会被窃听并且不再触发 OnDelete...有什么建议吗?

private void InitializeWatcher()
{
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    watcher.Filter = "*.*";
    watcher.Changed += new FileSystemEventHandler(OnChanged);
    watcher.Created += new FileSystemEventHandler(OnCreated);
    watcher.Deleted += new FileSystemEventHandler(OnDeleted);
    watcher.Renamed += new RenamedEventHandler(OnRenamed);
    watcher.EnableRaisingEvents = true;
}

private void OnDeleted(object sender, FileSystemEventArgs e)
{
    SetBalloonTip("File Eliminato");
    notifyIcon1.ShowBalloonTip(1);

    ((FileSystemWatcher)sender).Deleted -= new FileSystemEventHandler(OnDeleted);
    timerRepeat.Interval = 500;
    timerRepeat.Elapsed += new ElapsedEventHandler(t_Elapsed);
    timerRepeat.Start();
    } 

  void t_Elapsed(object sender, ElapsedEventArgs e)
    {
        ((System.Timers.Timer)sender).Stop();
    }

【问题讨论】:

    标签: c# directory filesystemwatcher


    【解决方案1】:

    这不是最有效的方法,但我可能会保留已删除文件的数量并每隔 n 次显示一次工具提示,例如

    private int deleteCounter = 0;
    
    private void OnDeleted(object sender, FileSystemEventArgs e)
    {
        //your delete code
        if(deleteCounter % 50 == 0)
        {
            SetBalloonTip("File Eliminato");
            notifyIcon1.ShowBalloonTip(1);
        }
    }
    

    【讨论】:

    • 即使我不明白这是如何工作的,这实际上是有效的!谢谢哥们! P.S:不,我的错,这根本不起作用
    • 如果这解决了您的问题,请将其标记为答案。谢谢。
    • 不,抱歉:
    • 每次删除文件时,您实际上是否将 deleteCounter 值增加 1?另外,如果这仍然太快,请尝试更改除数的值。
    • 好吧,我添加了,但我不太喜欢它,即使以这种方式删除了数百个文件也会出错。
    【解决方案2】:

    您最好在显示通知之前稍等片刻,并防止在资源管理器上推送太多通知。

    执行此操作的最佳方法是使用计时器将通知延迟 500 毫秒。在此期间,您可以在一个简单的计数器中跟踪有多少文件被删除。一旦计时器滴答作响,您将显示到目前为止已删除文件数量的通知。您重置计数器并等待通知消失。然后您回到初始状态,该过程可以重新启动。

    上述场景的实现可能如下所示:

    int pendingDeletes = 0;
    int TipState = 0; // keeps the state of the notifyIcon, 
                      // 0 = initial,
                      // 1 is about to be shown
                      // above 1 is waiting to reset to 0
    
    private void OnDeleted(object sender, FileSystemEventArgs e)
    {
        pendingDeletes++;
        if (TipState == 0)
        {
            TipState++; 
            // it didn't want to start http://stackoverflow.com/a/18348878
            this.Invoke( new MethodInvoker( () => timer1.Start()));
        }
    
    }
    
    // tick every 500 ms
    private void timer1_Tick(object sender, EventArgs e)
    {
        Trace.WriteLine(TipState);
        switch(TipState)
        { 
            case 1:
                notifyIcon1.BalloonTipText = String.Format("{0} deleted file(s)", pendingDeletes);
                notifyIcon1.ShowBalloonTip(500);
                pendingDeletes = 0;
                TipState++;
                break;
            case 2:
                // do nothing
                TipState++;
                break;
            case 3:
                // maybe do something if pendingDeletes > 0
                timer1.Stop();
                // back to initial state
                TipState = 0;
                break;
            default:
                // prevent mishaps
                TipState = 0;
                break;
        }
    }
    

    我找不到可靠的方法来检测通知是否已经消失,因此在我重置回初始状态之前会出现额外的等待状态。如果您的用户真的关心删除文件的确切数量,您可能希望围绕报告的已删除文件数量收紧内务管理。我把它留作练习。

    【讨论】:

    • 非常感谢,但我昨天已经找到了更快的解决方案,而且你的方法很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2014-03-08
    • 2016-09-09
    • 1970-01-01
    相关资源
    最近更新 更多