Moin
In C# habe ich einen Thread, der (knapp) 15 Minuten lang schläft. Wenn ich jetzt das Programm beenden will, muss ich leider diese 15 Min. warten. Gibt es auch eine Möglichkeit, den Sleep zu "killen"
Irgendwie komm ich mit der MSDN nicht so zurcht, jetzt finde ich nix mehr
C# Thread beenden
gepostet vor 18 Jahre, 1 Monat von Fornax
gepostet vor 18 Jahre, 1 Monat von TheUndeadable
msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpref/html/frlrfsystemthreadingthreadclassaborttopic2.asp
Thread.Abort
Die sauberere Möglichkeit wäre ein Event, das du auslöst bzw nach 15 Minuten automatisch ausgelöst wird. Aber ich kille den Thread auch immer hart ;-)
Thread.Abort
Die sauberere Möglichkeit wäre ein Event, das du auslöst bzw nach 15 Minuten automatisch ausgelöst wird. Aber ich kille den Thread auch immer hart ;-)
gepostet vor 18 Jahre, 1 Monat von Fornax
Soft killen tu ich ja jetzt auch, nur schläft mein Thread wie gesagt 15 Minuten, und das ist mit zu lang
Ok, abbrechen tut er, nur bekomme ich die Fehlermeldung:
Voraussichtliches Beenden des FGThreads am:
25.09.2006 15:00:00
FGThreadState: WaitSleepJoin
error in FGThread in Start()
Thread was being aborted.
FGThreadState: Stopped
FGThreadState: Stopped
Beenden des Servers am: 25.09.2006 14:53:19
Console.WriteLine("FGThreadState: "+FGThread.ThreadState);
Thread.Sleep(100);
FGThread.Abort();
Thread.Sleep(100);
Console.WriteLine("FGThreadState: "+FGThread.ThreadState);
// Wartet, bis der Thread beendet ist
FGThread.Join();
Console.WriteLine("FGThreadState: "+FGThread.ThreadState);
mainTime.printDateNow("Beenden des Servers am: ");
Aber solange es funzt
PS:
in FGThread Start() wird wohl diese Zeile gemeint sein:
Thread.Sleep(this.nextTick*1000);
Ok, abbrechen tut er, nur bekomme ich die Fehlermeldung:
Voraussichtliches Beenden des FGThreads am:
25.09.2006 15:00:00
FGThreadState: WaitSleepJoin
error in FGThread in Start()
Thread was being aborted.
FGThreadState: Stopped
FGThreadState: Stopped
Beenden des Servers am: 25.09.2006 14:53:19
FGThreadObject.Stop();
Console.WriteLine("FGThreadState: "+FGThread.ThreadState);
Thread.Sleep(100);
FGThread.Abort();
Thread.Sleep(100);
Console.WriteLine("FGThreadState: "+FGThread.ThreadState);
// Wartet, bis der Thread beendet ist
FGThread.Join();
Console.WriteLine("FGThreadState: "+FGThread.ThreadState);
mainTime.printDateNow("Beenden des Servers am: ");
Aber solange es funzt
PS:
in FGThread Start() wird wohl diese Zeile gemeint sein:
Thread.Sleep(this.nextTick*1000);
gepostet vor 18 Jahre, 1 Monat von TheUndeadable
In deinem Thread kannst du um dein Sleep-Statement noch die Ausnahme ThreadAbortException abfangen.
gepostet vor 18 Jahre, 1 Monat von Fornax
Wo wir grad beim Thema C# sind:
Ich will eine XML-Datei einlesen, möglichst als Array. Ein assotiatives Array wär mir am liebsten, aber sowas gibt's ja nicht Oder doch?
Da ich mich nicht selbst mit Read, NodeType und so durchhangeln will: Gibt es für sowas auch eine einfache Methode/Klasse?
Ich will eine XML-Datei einlesen, möglichst als Array. Ein assotiatives Array wär mir am liebsten, aber sowas gibt's ja nicht Oder doch?
Da ich mich nicht selbst mit Read, NodeType und so durchhangeln will: Gibt es für sowas auch eine einfache Methode/Klasse?
gepostet vor 18 Jahre, 1 Monat von TheUndeadable
Ne, ganz so einfach geht das leider AFAIK nicht.
Aber mit dem XmlDocument kommst du eigentlich sehr weit:
Wert
Wert2
Wert4
Auf der anderen Seite:
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load ( "xmldatei.xml" );
XmlNodeList xmlList = xmlDocument.SelectNodes ( "/datei/wert" );
foreach ( XmlNode xmlNode in xmlList )
{
Console.WriteLine ( xmlNode.Name );
Console.WriteLine ( xmlNode.InnerText );
}
XmlNode xmlSpezial = xmlDocument.SelectSingleNode ( "/datei/wert3" );
Console.WriteLine ( xmlSpezial.Attributes [ "name" ].InnerText );
So arbeitest du dich eigentlich nicht wirklich mit NodeType, etc dadurch.
EDIT:
Achso zum Thema assoziatives Array. Klar gibt es das:
Dictionary. Zu finden in System.Collections.Generic
Dictionary ahArray = new Dictionary();
ahArray [2] = 5;
Dictionary ahArray2 = new Dictionary();
ahArray2 [ "red" ] = Color.FromARGB(0,255,0,0 );
ahArray2 [ "red" ] = "UFFDADA";
Aber mit dem XmlDocument kommst du eigentlich sehr weit:
Wert
Wert2
Wert4
Auf der anderen Seite:
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load ( "xmldatei.xml" );
XmlNodeList xmlList = xmlDocument.SelectNodes ( "/datei/wert" );
foreach ( XmlNode xmlNode in xmlList )
{
Console.WriteLine ( xmlNode.Name );
Console.WriteLine ( xmlNode.InnerText );
}
XmlNode xmlSpezial = xmlDocument.SelectSingleNode ( "/datei/wert3" );
Console.WriteLine ( xmlSpezial.Attributes [ "name" ].InnerText );
So arbeitest du dich eigentlich nicht wirklich mit NodeType, etc dadurch.
EDIT:
Achso zum Thema assoziatives Array. Klar gibt es das:
Dictionary. Zu finden in System.Collections.Generic
Dictionary ahArray = new Dictionary();
ahArray [2] = 5;
Dictionary ahArray2 = new Dictionary();
ahArray2 [ "red" ] = Color.FromARGB(0,255,0,0 );
ahArray2 [ "red" ] = "UFFDADA";
gepostet vor 18 Jahre, 1 Monat von exe
Ich weiss nicht wie es bei C# aussieht, aber bei Java gibt es die Möglichkeit via thread.setDaemon(true) den Thread als Daemon laufen zu lassen. Das führt dazu, dass beim Runterfahren der VM auch der Thread beendet wird und die VM nicht auf das Ende des Threads wartet. Da C# mehr oder weniger eine Kopie von Java ist sind die Chancen gut das mit C# ein ähnliches Threadverhalten möglich ist.
Ansonsten: wenn ein Thread schläft musst du ihn eben wieder aufwecken. D.h. du schickst ein Interrupt (Unterbrechung) an alle schlafenden Threads. In dem entsprechenden Thread produziert das eine InterruptedException (in Java, wird in C# ähnlich heissen) auf die du in diesem Thread dann reagieren kannst.
Ansonsten: wenn ein Thread schläft musst du ihn eben wieder aufwecken. D.h. du schickst ein Interrupt (Unterbrechung) an alle schlafenden Threads. In dem entsprechenden Thread produziert das eine InterruptedException (in Java, wird in C# ähnlich heissen) auf die du in diesem Thread dann reagieren kannst.
gepostet vor 18 Jahre, 1 Monat von TheUndeadable
Ich weiss nicht wie es bei C# aussieht, aber bei Java gibt es die Möglichkeit via thread.setDaemon(true) den Thread als Daemon laufen zu lassen. Das führt dazu, dass beim Runterfahren der VM auch der Thread beendet wird und die VM nicht auf das Ende des Threads wartet. Da C# mehr oder weniger eine Kopie von Java ist sind die Chancen gut das mit C# ein ähnliches Threadverhalten möglich ist.
Ah, ok, sehr gut, wusste ich noch nicht.
Thread oThread = ....;
oThread.IsBackground = true;
msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpref/html/frlrfSystemThreadingThreadClassIsBackgroundTopic.asp?frame=true
Ansonsten: wenn ein Thread schläft musst du ihn eben wieder aufwecken. D.h. du schickst ein Interrupt (Unterbrechung) an alle schlafenden Threads. In dem entsprechenden Thread produziert das eine InterruptedException (in Java, wird in C# ähnlich heissen) auf die du in diesem Thread dann reagieren kannst.
Thread oThread = ....;
oThread.Interrupt();
msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/cpref/html/frlrfsystemthreadingthreadclassinterrupttopic.asp
Wäre wahrscheinlich eine andere saubere Möglichkeit. Danke exe für die Idee mit dem Background-Thread.
Klugscheiß: (BTW: Es heißt .Net und nicht C#. C# ist nur eine Art und Weise auf das .Net-Framework zuzugreifen)
gepostet vor 18 Jahre, 1 Monat von MrMaxx
jetzt beendet doch endlich mal jemand diesen C# Thread