C# c限制MessageBox的数量

C# c限制MessageBox的数量,c#,messagebox,filesystemwatcher,C#,Messagebox,Filesystemwatcher,你好,我又遇到了一个我自己解决不了的问题 我有一个名为filOvervakare的文件系统监视程序,并使用此代码触发一个方法 filOvervakare.NotifyFilter = NotifyFilters.Size; filOvervakare.NotifyFilter = NotifyFilters.LastWrite; filOvervakare.Changed += new FileSystemEventHandler(filOvervakare_Changed); 方法如下:

你好,我又遇到了一个我自己解决不了的问题

我有一个名为filOvervakare的文件系统监视程序,并使用此代码触发一个方法

filOvervakare.NotifyFilter = NotifyFilters.Size;
filOvervakare.NotifyFilter = NotifyFilters.LastWrite;

filOvervakare.Changed += new FileSystemEventHandler(filOvervakare_Changed);
方法如下:

void filOvervakare_Changed(object sender, FileSystemEventArgs e)
{
    if (MessageBox.Show("Vill du ladda upp filen " + e.Name + "?", "En fil har ändrats", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
    {
        //code code code           
    }
}
每次更改文件时,它都应该显示messagebox一次。问题是,不是得到一个消息框,而是弹出5-6个消息框,我不知道如何解决这个问题,我希望你们中的一些人可能有一个好的解决方案

谢谢


//Morgan

您可以使用布尔值来告诉您是否打开了一个消息框

private bool messageBoxIsOpen;

void filOvervakare_Changed(object sender, FileSystemEventArgs e)
{
    if (this.messageBoxIsOpen)
    {
        return;
    }

    this.messageBoxIsOpen = true;
    if (MessageBox.Show(
        "Vill du ladda upp filen " + e.Name + "?", 
        "En fil har ändrats", 
        MessageBoxButtons.YesNo, 
        MessageBoxIcon.Question) == DialogResult.Yes)
    {
       //code code code           
    }

    this.messageBoxIsOpen = false;
}

您可以使用布尔值来告诉您是否打开了消息框

private bool messageBoxIsOpen;

void filOvervakare_Changed(object sender, FileSystemEventArgs e)
{
    if (this.messageBoxIsOpen)
    {
        return;
    }

    this.messageBoxIsOpen = true;
    if (MessageBox.Show(
        "Vill du ladda upp filen " + e.Name + "?", 
        "En fil har ändrats", 
        MessageBoxButtons.YesNo, 
        MessageBoxIcon.Question) == DialogResult.Yes)
    {
       //code code code           
    }

    this.messageBoxIsOpen = false;
}

根据设计,每个通知都在不同的线程上调用事件处理程序。快速修复方法是设置FileSystemWatcher.SynchronizingObject属性:

    public Form1() {
        InitializeComponent();
        fileSystemWatcher1.SynchronizingObject = this;
    }

但这不是一个好主意,FSW可能会错过通知,因为它被阻止,等待您单击“确定”按钮。在通知事件中显示消息框不是一个好主意,您希望尽快处理通知。

这是一种设计,每个通知都在不同的线程上调用事件处理程序。快速修复方法是设置FileSystemWatcher.SynchronizingObject属性:

    public Form1() {
        InitializeComponent();
        fileSystemWatcher1.SynchronizingObject = this;
    }

但这不是一个好主意,FSW可能会错过通知,因为它被阻止,等待您单击“确定”按钮。在通知事件中显示消息框不是一个好主意,您希望尽快处理通知。

解决此问题的最简单方法是声明私有bool,如下所示:

private bool m_IsBoxShown;
在构造函数中,将值设置为false。将上面的代码更改为如下所示: void filOvervakare_Changedobject发送方,FileSystemEventArgs e { 如果m_isboxShowed==false { m_isboxShowed=真; 如果MessageBox.ShowVill du ladda upp filen+e.Name+?,En fil harändrats,MessageBoxButtons.YesNo,MessageBoxIcon.Question==DialogResult.Yes { m_isboxShowed=假; //代码 }else{m_isboxShowed=false;} }
}解决这个问题的最简单方法是声明一个私有bool,如下所示:

private bool m_IsBoxShown;
在构造函数中,将值设置为false。将上面的代码更改为如下所示: void filOvervakare_Changedobject发送方,FileSystemEventArgs e { 如果m_isboxShowed==false { m_isboxShowed=真; 如果MessageBox.ShowVill du ladda upp filen+e.Name+?,En fil harändrats,MessageBoxButtons.YesNo,MessageBoxIcon.Question==DialogResult.Yes { m_isboxShowed=假; //代码 }else{m_isboxShowed=false;} }
}文件系统监视程序会触发一些事件,如LastAccess、LastWrite等。您可以在显示消息框之前检查事件参数以了解触发事件的原因,或设置NotifyFilter属性。

文件系统监视程序会触发一些事件,如LastAccess、LastWrite等。您可以在显示消息框之前检查事件参数以了解触发事件的原因,或者设置NotifyFilter属性。

我建议在显示消息框之前有一个短暂的延迟,比如10-100ms。这样,当一个文件快速更改几次时,您只会收到一个MessageBox


换句话说,当收到通知时,启动计时器。如果计时器已启动,请忽略该通知。当计时器触发时,停止计时器并显示MessageBox。

我建议在显示MessageBox之前有一个短暂的延迟,比如10-100ms。这样,当一个文件快速更改几次时,您只会收到一个MessageBox


换句话说,当收到通知时,启动计时器。如果计时器已启动,请忽略该通知。计时器触发时,停止计时器并显示MessageBox。

您可以将上次更改的文件名保存在虚拟变量中,并且在引发更改事件时,除非文件名与保存的变量不同,否则不要显示MessageBox

string lastChangedFileName = "";
void filOvervakare_Changed(object sender, FileSystemEventArgs e)
    {

if(lastChangedFileName != e.Name)
{
        if (MessageBox.Show("Vill du ladda upp filen " + e.Name + "?", "En fil har ändrats", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        {
           //code code code           
        }
}
lastChangedFileName = e.Name;

    }

可以将上次更改的文件名保存在虚拟变量中,并且在引发更改事件时,除非文件名与保存的变量不同,否则不要显示messagebox

string lastChangedFileName = "";
void filOvervakare_Changed(object sender, FileSystemEventArgs e)
    {

if(lastChangedFileName != e.Name)
{
        if (MessageBox.Show("Vill du ladda upp filen " + e.Name + "?", "En fil har ändrats", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
        {
           //code code code           
        }
}
lastChangedFileName = e.Name;

    }

谢谢,这是最简单的解决方案!谢谢大家用不同的方法来解决我的问题//Morgan不应最后更改FileName=e.名称;在显示消息框之前是否在if语句中?否则,lastChangedFileName将仅在消息框关闭后设置,并且将在每次引发事件时设置。谢谢,这是最简单的解决方案!谢谢大家用不同的方法来解决我的问题//Morgan不应最后更改FileName=e.名称;在之前在if语句中
是否显示消息框?否则,lastChangedFileName将仅在消息框关闭后设置,它将在每次引发事件时进行设置。@nobugz:请在不同的线程上调用事件处理程序,每个通知需要引用。@sameh:6个消息框是否足够证明?@nobugz:请在不同的线程上调用事件处理程序。@sameh:6个消息框是否足够证明?