5

Używam języka C# w programie Visual Studio 2010 ze strukturą 4.0.Za każdym razem, gdy otwieram program Visual Studio, zmiany w pliku FileSystemWatcher EnableRaisingEvent

W moim projekcie, w dwóch różnych formach, są dwa FileSystemWatcher s z właściwością EnableRaisingEvent ustawioną na false. Jeśli zamknę Visual Studio, po ponownym otwarciu otrzymam zarówno FileSystemWatcher właściwość EnableRaisingEvent ustawioną na true.

W obu moich formularzy w pliku projektanta nie jest następujący kod:

private void InitializeComponent() 
{ 
    this.components = new System.ComponentModel.Container(); 
    System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); 
    this.fileSystemWatcher1 = new System.IO.FileSystemWatcher(); 
    ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit(); 
    this.SuspendLayout(); 

    this.fileSystemWatcher1.Filter = "my_filter"; 
    this.fileSystemWatcher1.NotifyFilter = System.IO.NotifyFilters.LastWrite; 
    this.fileSystemWatcher1.SynchronizingObject = this; 
    this.fileSystemWatcher1.Changed += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_Changed); 
} 

Obiekt EnableRaisingEvent nie jest ustawiona, ale domyślnie jest false.

Każdy pomysł, dlaczego dostaję to dziwne zachowanie?

edit

Poszedłem za sugestię Virtlink, dodając następujący wiersz kodu:

this.fileSystemWatcher1.EnableRaisingEvents = false; 

Wydawało się rozwiązać mój problem, ale po kilku dniach (i niektórych otwierania, zamykania i przebudowa projektu, ale bez modyfikacji fileSystemWatcher1) znalazłem:

  • w projektancie W właściwościach fileSystemWatcher1, EnableRaisingEvents został cofnięty do true

  • w kodzie, linia uprzednio dodano brakujące

Próbowałem przeprowadzce do Visual Studio 2012 (jeszcze Framework 4.0) i obejście naprawiło problem na kilka kolejnych dni. Wtedy dostałem taką samą sytuację jak w VS10.

Każdy inny pomysł?

+0

Czy możesz potwierdzić, dodałeś sugestię Virtlink "this.fileSystemWatcher1.EnableRaisingEvents = false; ' w konstruktorze pliku Form.cs? –

+0

@jacobaloysious zrobiłem, i wydaje się, że to naprawić problem! Dziękuję też. – 888

Odpowiedz

2

To samo dzieje się w Visual Studio 2012 i nie trzeba zamykać Visual Studio. Ponowne otwarcie projektanta formularzy wystarczy, aby ustawić właściwość na True, zarówno wizualnie w projektancie, jak iw czasie wykonywania.

Wygląda na to, że jest to błąd w FileSystemWatcher.

Rozwiązaniem jest dodanie tej linii do Twojego InitializeComponent extenso:

this.fileSystemWatcher1.EnableRaisingEvents = false; 

Jeżeli projektant nie będzie działać z cię, będziesz musiał pracować przeciwko go. Wszystko, co umieścisz w szablonie InitializeComponent, może zostać nadpisane lub usunięte przez projektanta, ponieważ terytorium projektanta jest InitializeComponent. Jednym ze sposobów radzenia sobie z tym jest dodanie linii po wywołaniu połączenia z InitializeComponent w konstruktorze formularza.

InitializeComponent(); 
this.fileSystemWatcher1.EnableRaisingEvents = false; 

Oznacza to, że projektant nie pokazać prawidłową wartość EnableRaisingEvents, ale ponieważ to nie działa zbyt dobrze w każdym razie, że nie może być tak duży problem. Umieszczenie linii w konstruktorze gwarantuje, że nie zostanie ona usunięta przez projektanta w żadnym momencie w przyszłości.

+0

Dziękuję za sugestie. Teraz wydaje się być rozwiązany! – 888

1

Teraz nie oczekuję, że ta odpowiedź zostanie przyjęta, ale tutaj tak czy owak. Napisałem mały program do przetwarzania wstępnego, który odczytuje i modyfikuje pliki źródłowe C# w projekcie Visual Studio i robi kilka interesujących rzeczy, takich jak zapewnienie niektórych usług lokalizacyjnych i wstawianie unikalnych tokenów dziennika w moich instrukcjach logowania. Ten program preprocesora jest wywoływany przez obiekt docelowy BeforeBuild we wszystkich moich plikach .csproj, więc jest uruchamiany jako część każdej kompilacji.

Obecnie nie mam do czynienia z plikami .Designer.cs, ale modyfikuję pliki .resx i mają one tę samą niefortunną cechę, że są pod patronatem projektanta Visual Studio, więc moje modyfikacje zostają odrzucone za każdym razem, gdy zmienić formularz, ale wtedy mój preprocesor po prostu zmienia ponownie plik .resx. Byłaby to ta sama procedura ponownego wstawienia tej instrukcji, aby ustawić wartość EnableRaisingEvents na wartość false, gdy projektant Visual Studio ją odrzucił.

Używałby młota do umieszczania pinezki w miejscu, ale to by działało.

EDIT:

Dla każdego, kto bierze pod uwagę realizację tego jako techniki do rozwiązania tego lub podobnych problemów, ten wątek zawiera kilka wskazówek, w jaki sposób uczynić Visual Studio współistnieją z preprocesora: How to get Visual Studio to reread source files after BeforeBuild processing?

1

idę z Virtlink sugestii na dodanie wymaganej linii w kodzie, przykład:

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      this.fileSystemWatcher1.EnableRaisingEvents = false; 
     } 
    }  

Oto kilka powodów, mogę dowiedzieć się bronić, dlaczego nie powinno się (nigdy) edytować projektanta .cs

Można znaleźć więcej informacji z komentarza Herenvardo Here. Oto jego krótki opis:

Edycja pliku .Designer.cs (lub. Designer.vb w języku Visual Basic) nigdy nie jest zalecana, niezależnie od tego, dlaczego chcesz ją edytować; i prawie nigdy nie jest potrzebne. Istnieją dwa główne powody, dla edycji tych plików jest tak niewłaściwe:

  1. IDE zapisuje te pliki z bardzo sztywne standardy kodowania, i oczekuje od nich, aby śledzić takie konwencje (rzeczy takie jak odstępy i rozdzielaniem nie podniesie problemy, ale wszystko, co zmienia strukturę pliku lub drzewa parsowania kodu, jest bardzo podatne na nieprzyjemne efekty uboczne).
  2. IDE może nadpisać twoje zmiany w wielu sytuacjach, bez potrzeby nawet mówienia ci o tym . Ogólnie rzecz biorąc, w przypadku pliku formularza lub kontroli użytkownika formularza . Plik jest zastępowany za każdym razem, gdy zmienisz projektantowi . Dla plików z ustawieniami (nie mam za dużo praktyki z tymi), myślę, że są one przepisywane podczas edycji ustawień z samego IDE (ze strony ustawień właściwości projektu). Najprostszym sposobem, aby być bezpiecznym, jest przypuszczenie, że IDE może zmienić dowolny plik .designer w dowolnym momencie i z dowolnego powodu.Pomimo, że jest dobrze zdefiniowany, gdy IDE zapisze każdy plik, może być dość trudno wiedzieć i pamiętać, kiedy i dlaczego każdy plik może być przerobiony, więc lepiej bezpieczne niż przepraszam.
+0

Chociaż nie jest to zalecane, możesz edytować pliki projektanta, jeśli zachowasz strukturę pliku. Na przykład często zdarza się usuwać procedurę obsługi zdarzeń i nieco rzadziej, ale można dodać wartość _as, jeśli projektant ją ustawił. Oba mogą być zwykle osiągnięte przez samego projektanta, więc nie ma potrzeby edycji. – Virtlink

Powiązane problemy