C# là mới đối với tôi và tôi gặp khó khăn với cùng một sự cố trong gần một tuần. Tôi đã có điều này:
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;
}
}
Tôi thậm chí đặt khoảng thời gian hẹn giờ thành 1 mili giây và một số sự kiện tệp mới bị thiếu. Tôi đã cố gắng cập nhật notificationsListBox
từ bên trong sự kiện onCreated
nhưng tôi luôn gặp lỗi Tham chiếu chéo. Điều này cho đến khi tôi phát hiện ra rằng sự kiện onCreated
của người quan sát được thực hiện trong một chủ đề khác với chủ đề chính, do đó, trong vỏ hạt, đây là giải pháp của tôi:
Tôi bao gồm public delegate void Action()
làm thuộc tính của tôi và sau đó sử dụng Invoke
để cập nhật notificationsListBox
từ bên trong sự kiện onCreated
. Tiếp theo, mã mẫu:
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());}));
}
Vì vậy, bộ hẹn giờ và mã của nó không còn cần thiết nữa. Điều này làm việc tuyệt vời cho tôi và tôi hy vọng nó cho bất cứ ai có tình huống tương tự. Trân trọng !!!
Hãy nhớ rằng FileSystemWatcher dựa trên hệ điều hành để báo hiệu khi tệp được thêm/sửa/xóa/v.v. Vì vậy, có nhiều trường hợp sẽ không giúp ích gì. –