C# для меня новичок, и я почти неделю боролся с одной и той же проблемой. У меня было это:
private void btnWatchFile_Click(object sender, EventArgs e)
{
//code to create a watcher and allow it to reise events...
}
//watcher onCreate event
public void onCreated(object sender, FileSystemEventArgs e)
{
if (!updateNotifications )
{
stringBuilder.Remove(0, stringBuilder.Length);
stringBuilder.Append(e.FullPath);
stringBuilder.Append(" ");
stringBuilder.Append(e.ChangeType.ToString());
stringBuilder.Append(" ");
stringBuilder.Append(DateTime.Now.ToString());
updateNotifications = true;
}
}
//timer to check the flag every X time
private void timer_Tick(object sender, EventArgs e)
{
if (updateNotifications )
{
notificationListBox.Items.Insert(0, stringBuilder.ToString());
updateNotifications = false;
}
}
Я даже установил интервал таймера на 1 миллисекунду, но некоторые новые файловые события отсутствовали. Я пытался обновить notificationsListBox из события onCreated, но всегда получал ошибку перекрестной ссылки. Так было до тех пор, пока я не узнал, что событие наблюдателя onCreated выполняется в потоке, отличном от потока основного метода, поэтому, в двух словах, это мое решение:
Я включил public delegate void Action() в качестве атрибута своего класса, а затем использовал Invoke для обновления notificationsListBox из события onCreated. Далее код детали:
public void onCreated(object sender, FileSystemEventArgs e)
{
stringBuilder.Remove(0, stringBuilder.Length);
stringBuilder.Append(e.FullPath);
stringBuilder.Append(" ");
stringBuilder.Append(e.ChangeType.ToString());
stringBuilder.Append(" ");
stringBuilder.Append(DateTime.Now.ToString());
updateNotifications = true;
Invoke((Action)(() => {notificationListBox.Items.Insert(0, stringBuilder.ToString());}));
}
Так что таймер и его код больше не нужны. Это отлично работает для меня, и я надеюсь, что это сработает для всех, у кого похожая ситуация. С наилучшими пожеланиями!!!
person
3sley
schedule
17.09.2015