Mono i GC

0

Hej, piszę aplikację na mono i mam już tego mono serdecznie dość. Zauważam dziwne anomalie, raz dany kod się wykona a raz nie. Dodam do jakiejś klasy prosty destruktor który ma za zadanie jedynie wypisać komunikat na ekranie, raz zadziała a raz aplikacja się wywali rzucając takie coś:

Unhandled Exception:
System.NotSupportedException: Stream does not support writing
  at System.IO.FileStream.Write (System.Byte[] array, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0
  at System.IO.StreamWriter.FlushBytes () [0x00000] in <filename unknown>:0
  at System.IO.StreamWriter.FlushCore () [0x00000] in <filename unknown>:0
  at System.IO.StreamWriter.Write (System.Char[] buffer, Int32 index, Int32 count) [0x00000] in <filename unknown>:0
  at System.IO.CStreamWriter.Write (System.Char[] buffer, Int32 index, Int32 count) [0x00000] in <filename unknown>:0
  at System.IO.CStreamWriter.Write (System.Char[] val) [0x00000] in <filename unknown>:0
  at System.IO.CStreamWriter.Write (System.String val) [0x00000] in <filename unknown>:0
  at System.IO.TextWriter.WriteLine (System.String value) [0x00000] in <filename unknown>:0
  at System.IO.SynchronizedWriter.WriteLine (System.String value) [0x00000] in <filename unknown>:0
  at System.Console.WriteLine (System.String value) [0x00000] in <filename unknown>:0
  at Mobiltek.WinSmsGW.DummyRouter.TranslatedDummyRouter.Finalize () [0x00000] in <filename unknown>:0
 

Na mono nawet destruktor i GC powodują problemy??? Czy mój kod jest po prostu źle napisany?

0

powinno dzialac normalnie.
Pokaz kod. Zapewne cos robisz na niezinicjowanym obiekcie

0

Kod destruktora to zwykłe Console.WriteLine(...);
Ogólnie program jest dosyć rozbudowany, korzysta z kilku wątków, dziwi mnie że np. Obiekt A zawiera obiekt B, usuwam obiekt B z obiektu A, potem obiekt A, a destruktory wykonają się w odwrotnej kolejności tj, najpierw Destruktor A potem B. Jak to w ogóle jest możliwe...

0

Po co Ci w ogóle ten destruktor?

0
somekind napisał(a):

Po co Ci w ogóle ten destruktor?

Ot tak, chce się upewnić że obiekt został usunięty. W programie jest kilka wątków, komunikuje się z zewnętrzną aplikacją przez WCF, zdarza się że główny watek aplikacji się zakończy ale proces nadal żyje bo albo coś z tym WCF mam nie tak albo jakiś inny wątek nie zakończył działania. Te destruktory to w celach diagnostycznych, ale nawet tego za bardzo użyć nie mogę bo powodują błędy. Czy po zakończeniu głównego wątku aplikacji użycie Console.WriteLine() w jakimś innym wątku jest działaniem niedozwolonym?

0

Bez kodu to raczej ciężko w czymkolwiek pomóc.

0

po pierwsze, pokaż kod.

po drugie, "destruktor" w C# jest niedeterministyczny, tj. wykonuje się, ale nie wiadomo kiedy. więc może wykonuje się za późno, kiedy konsola już nie działa.
jak chcesz deterministyczne niszczenie obiektu, to użyj IDisposable i metody Dispose(), którą trzeba albo ręcznie wywoływać albo użyć słowa kluczowego using.

0
Świetny Samiec napisał(a):

W programie jest kilka wątków, komunikuje się z zewnętrzną aplikacją przez WCF, zdarza się że główny watek aplikacji się zakończy ale proces nadal żyje bo albo coś z tym WCF mam nie tak albo jakiś inny wątek nie zakończył działania.

A logujesz jakoś działanie metod z tych wątków? Od tego bym zaczął diagnostykę jakichś problemów tego typu.

Te destruktory to w celach diagnostycznych, ale nawet tego za bardzo użyć nie mogę bo powodują błędy.

Destruktory zmieniają normalne działanie GC, obiekty zawierające destruktory mogą trafić do innej generacji i być usuwane w zupełnie innym czasie niż gdyby destruktorów nie zawierały. Destruktor to nie jest miejsce do diagnozowania działania GC.

1 użytkowników online, w tym zalogowanych: 0, gości: 1