c # Ограничить количество сообщений - PullRequest
1 голос
/ 02 марта 2010

Здравствуйте, я снова столкнулся с проблемой, которую не могу решить самостоятельно.

У меня есть FileSystemWatcher с именем 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           
    }
}

Каждый раз, когда файл изменяется, он должен показывать окно сообщения один раз. Проблема в том, что вместо того, чтобы получить одно окно сообщения, оно появляется как 5-6 из них, и я не знаю, как это исправить, и я надеюсь, что некоторые из вас могли бы найти хорошее решение. :)

Спасибо!

// Морган

Ответы [ 6 ]

2 голосов
/ 02 марта 2010

Это предусмотрено, что обработчик событий вызывается в отдельном потоке для каждого уведомления. Быстрое решение состоит в том, чтобы установить свойство FileSystemWatcher.SynchronizingObject:

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

Но это не очень хорошая идея, FSW может пропустить уведомления, потому что он заблокирован, ожидая, когда вы нажмете кнопку OK. Отображение окна сообщения в событии уведомления не очень хорошая идея, вы хотите обработать уведомления как можно быстрее.

1 голос
/ 02 марта 2010

Вы можете сохранить последнее измененное имя файла в фиктивной переменной, и при возникновении измененного события не показывать окно сообщения, если имя файла не отличается от сохраненной переменной.

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;

    }
1 голос
/ 02 марта 2010

Существует несколько событий, например, LastAccess, LastWrite и т. Д., Которые наблюдатель файловой системы запускает. Перед тем, как отобразить окно сообщения, можно проверить аргументы события и выяснить, почему оно было запущено, или установить свойство NotifyFilter.

1 голос
/ 02 марта 2010

Вы можете использовать логическое значение, чтобы сообщить вам, открыто ли окно сообщения.

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;
}
0 голосов
/ 02 марта 2010

Я бы порекомендовал иметь небольшую задержку, скажем, 10-100 мс, прежде чем показывать MessageBox. Таким образом, когда файл меняется очень быстро несколько раз, вы получаете только один MessageBox.

Другими словами, когда приходит уведомление, запустите таймер. Если таймер уже запущен, игнорируйте уведомление. Когда таймер сработает, остановите таймер и покажите MessageBox.

0 голосов
/ 02 марта 2010

Самый простой способ исправить это - объявить приватный бул, например:

private bool m_IsBoxShown;

В вашем конструкторе установите значение false. Измените свой код выше, чтобы читать так: void filOvervakare_Changed (отправитель объекта, FileSystemEventArgs e)
{
if (m_IsBoxShown == false) { m_IsBoxShown = TRUE; if (MessageBox.Show ("Vill du ladda upp filen" + e.Name + "?", "En fil har ändrats", MessageBoxButtons.ESNno, MessageBoxIcon.Question) == DialogResult.Yes)
{
m_IsBoxShown = ложь; // код код код
} else {m_IsBoxShown = false; } } }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...