Thread beenden
-
Hallo zusammen,
wie kann ich einen Thread beenden, welche gerade die Tastatur abfraget mit z.B. "reader.ReadString()"
thread.abort() funktioniert da nicht...
Grüße Opal
-
Es gibt genau einen korrekten Weg um einen Thread zu beenden. Und das ist, die Threadfunktion returnen zu lassen.
-
ok, danke schon mal, die Frage die bleibt ist, wie ich den Thread dazu bewegen kann von der Tastatur abzulassen.
Ich suche eine Methode wie Thread.Return(); ;-))
Grüße Opal
-
Opal19 schrieb:
ok, danke schon mal, die Frage die bleibt ist, wie ich den Thread dazu bewegen kann von der Tastatur abzulassen.
Ja da musst du dir was überlegen. Wenn der Thread in einer Methode festhängt, dann wirst du einen Weg finden müssen um diese Methode zurückkehren zu lassen. Da ich nicht weiß um was es sich da genau handelt, kann ich leider nicht mehr dazu sagen.
Opal19 schrieb:
Ich suche eine Methode wie Thread.Return(); ;-))
Sowas wirst du nicht finden, das macht keinen Sinn. Der Thread muss returnen. Und dafür gibt's das return; Statement.
-
Hi Dot,
ich hoffte Du hättest den ;-)) Smilie gesehen...
ist mir schon klar, dass es meine "Wunschmethode" nicht gibt.
Meine Konsolenanwendung fragt in einem Thread die Tastatur ab .ReadLine()...
Dieses tut der Thread offensichtlich so lange bis ENTER eingegeben wird. Danach wirkt thread.abort() und der Thread wird beendet.
Alles was mir einfällt wäre dei ENTER Eingabe zu simulieren, aber wirklich chick finde ich dieses nicht. Hat .NET nix dafür in Petto?
Grüße Opal
-
Wenn der Thread in einem Alertable Wait State ist, kann man ihm nen APC unterschieben.
Wobei aber fraglich ist, wie der Framework-Code dann darauf reagiert.
Also mit Vorsicht zu geniessen.Ansonsten "einfach" asynchrone IO-Funktionen verwenden.
Oder so.
Nen?
-
Ich hätte jetzt einfach mal versucht Console.In zu closen, evtl. returned Read() dann oder wirft eine Exception. Ansonsten musst du dich wohl mit Async IO befassen, wie hustbaer schon angedeutet hat...
-
BTW: versuch mal in den Framework-Code reinzusteppen, bzw. guck dir den (native) Callstack von dem Thread an, in welcher Funktion der genau hängt.
Möglicherweise reicht es wirklich einen APC an den Thread zu schicken, der genau nix tut. Dadurch kommen die diversen "alertable" Wartefunktionen nämlich zurück, und wenn du Glück hast wird das "Abort Flag" nochmal geprüft, bevor der Thread wieder heia geschickt wird.
Wobei ich jetzt nicht weiss wie man in .NET nen APC absetzt.
Von "native" Code aus würde man QueueUserAPC verwenden, falls dir die Info hilft.
-
Credits to Google.
string ReadLine(int timeoutms) { ReadLineDelegate d = Console.ReadLine; IAsyncResult result = d.BeginInvoke(null, null); result.AsyncWaitHandle.WaitOne(timeoutms);//timeout e.g. 15000 for 15 secs if (result.IsCompleted) { string resultstr = d.EndInvoke(result); Console.WriteLine("Read: " + resultstr); return resultstr; } else { Console.WriteLine("Timed out!"); throw new TimedoutException("Timed Out!"); } } delegate string ReadLineDelegate();
-
Dot, genial, es tuuuut!
Danke Dir, opal (allen anderen nat. auch)
-
loks schrieb:
Credits to Google.
...
Leider keine Lösung. Nach einem Timeout läuft das Delegat asynchron weiter und wartet in dem Fall also auf die nächste Benutzereingabe. Die ist damit verloren.