C# jest dla mnie nowy i zmagałem się z tymi samymi problemami przez prawie tydzień. Miałem to:
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;
}
}
I nawet ustawić interwał czasowy do do 1 milisekundy i jeszcze kilka nowych wydarzeń plików brakowało. Próbowałem zaktualizować notificationsListBox
od wewnątrz zdarzenia onCreated
, ale zawsze otrzymałem komunikat Odsyłacz. To było, dopóki nie odkryłem, że zdarzenie obserwatora jest wykonywane w wątku innym niż główny wątek metody, więc w powłoce nakrętki jest to moje rozwiązanie:
Dołączyłem public delegate void Action()
jako atrybut mojego klasy, a następnie użył Invoke
, aby zaktualizować notificationsListBox
ze zdarzenia onCreated
. Następnie kod utworu:
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());}));
}
Tak więc timer i jego kod nie są już potrzebne. To działa doskonale dla mnie i mam nadzieję, że zrobi to dla każdego, kto ma podobną sytuację. Pozdrawiam !!!
Należy pamiętać, że FileSystemWatcher polega na systemie operacyjnym, który sygnalizuje, kiedy pliki są dodawane/modyfikowane/usuwane/itd. Zatem posiadanie wielu instancji nie pomoże. –