none
Consolen Programm endet mit Fehlermeldung RRS feed

  • Frage

  • Halli hallo,
    ich habe wieder mal ein problem mit einem kleinen progi....
    es läuft in der konsole und endet immer wieder mal gern mit foldender fehlermeldung:

    ContextSwitchDeadlock wurde erkannt.
    Message: Die CLR konnte 60 Sekunden lang keinen Übergang vom COM-Kontext 0x33b4dd8 zum COM-Kontext 0x33b4f48 durchführen. Der Thread, der Besitzer des Zielkontexts/-apartments ist, wartet entweder, ohne Meldungen zu verschieben, oder verarbeitet eine äußerst lang dauernde Operation, ohne Windows-Meldungen zu verschieben. Eine solche Situation beeinträchtigt in der Regel die Leistung und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder die Speicherauslastung immer weiter zunimmt. Zur Vermeidung dieses Problems sollten alle STA-Threads (Singlethread-Apartment) primitive Typen verwenden, die beim Warten Meldungen verschieben (z.B. CoWaitForMultipleHandles), und bei lange dauernden Operationen generell Meldungen verschieben.

    woran kann das liegen ???

    mfg tombit
    Freitag, 7. August 2009 19:34

Antworten

  • hi elmar,

    ne verweise sind da nicht mehr drin...

    souble habe ich nicht verwendet, da ich gern die 28
    stellen von der decimal variable haben wollte :)

    ansonste gibt es keine verweise in das alte progei, da ich
    wirklich nur die reine berechnung mitgenommen hatte...

    habe jetzt folgendes umgebaut und das progi arbeitet
    jetzt schon 6stunden...

    ich hatte früher drin, dass er mit writeline alle 1mille
    berechnungen einmal je ne zeile ausgibt und die nächste
    drunter schreibt

    jetzt lösche ich vor jedem schreiben einmal den
    bildschirm der konsole (clear())

    ja wer weis woran das so lag...

    mfg tombit...
    Samstag, 8. August 2009 20:18

Alle Antworten

  • Hallo Tombit,

    eine etwas ausführlichere Beschreibung zu der Meldung findest Du unter
    contextSwitchDeadlock-MDA

    Wie dort beschrieben ist die Ursache oft der Einsatz von COM-Komponenten
    in Verbindung mit mehreren Threads. Es handelt sich dabei nicht zwangsläufig
    um einen Fehler, sondern nur auf einen mögliches Problem.

    Abhilfe kann u. U. das MTAThead Attribute für Sub Main zu setzen
     <MTAThread> _
    Sub Main()
    ...
    End Sub
    Startest Du selbst weitere Thread setze dort
    Thread.ApartmentState = ApartmentState.MTA
    und probiere ob damit der Fehler verschwindet.

    Gruß Elmar
    • Bearbeitet Elmar Boye Samstag, 8. August 2009 08:39 MTA
    Samstag, 8. August 2009 07:42
  • hi elmar,

    irgendwie verstehe ich das alles nicht, da
    ich eigentlich nix weiter mache als eine pi-berechnung.
    alle x-tausend durchläufe lasse ich das momentane
    ergebnis in der console mit writeline ausgeben...

    ein ähnliches problem hatte ich, als ich die berechnung
    in der normalen form ausgegeben habe dabei hielt das
    progi immer mal sporadisch an und gab in der textbox
    nix mehr aus deswegen bin ich mal testweise auf die
    console umgestiegen...

    kann es ev. an den compilereinstellungen liegen?
    ich verwende nämlich variablen, die als decimal
    dimensioniert sind ...

    mfg tombit
    Samstag, 8. August 2009 10:32
  • Hallo tombit,

    bei einer typischen Berechnung von PI sollte das nicht zutreffen,
    wenn Du ausser Math... und ein bisschen Console nichts weiter verwendest.

    Decimal ist ein reiner .NET Typ, der hat damit nichts zu tun haben dürfte.
    Wobei  System.Double von der Geschwindigkeit günstiger wäre, da dort
    die FPU des Prozessors mithelfen kann.

    Oder ganz Integer Mathematik, wie z. B. (allerdings C#):
    http://www.omegacoder.com/?p=91

    Da Du schreibst Du hast das Programm von einer WinForms Anwendung umgestellt:
    Sind da noch Verweise von auf die Windows Forms Assembly vorhanden
    und auch das Visual Basic Applikation Framework solltest Du probehalber
    abschalten wenn es in den Projekteigenschaften aktiv ist.

    Gruß Elmar

    • Bearbeitet Elmar Boye Samstag, 8. August 2009 11:40 Link eingefügt
    Samstag, 8. August 2009 11:36
  • hi elmar,

    ne verweise sind da nicht mehr drin...

    souble habe ich nicht verwendet, da ich gern die 28
    stellen von der decimal variable haben wollte :)

    ansonste gibt es keine verweise in das alte progei, da ich
    wirklich nur die reine berechnung mitgenommen hatte...

    habe jetzt folgendes umgebaut und das progi arbeitet
    jetzt schon 6stunden...

    ich hatte früher drin, dass er mit writeline alle 1mille
    berechnungen einmal je ne zeile ausgibt und die nächste
    drunter schreibt

    jetzt lösche ich vor jedem schreiben einmal den
    bildschirm der konsole (clear())

    ja wer weis woran das so lag...

    mfg tombit...
    Samstag, 8. August 2009 20:18