Asynchrones Sleep in Konsolen Anwendung

10/07/2013 00:47 Requi#1
Wie kann ich ein Async Sleep schreiben?
Bei einer Form Anwendung würde ich einen Backgroundworker nutzen.

Aber bei Konsolen habe ich keinen Plan, da ich davor damit nie gearbeitet habe.

Google hat mir leider keine hilfreichen Ergebnisse gebracht.
10/07/2013 02:19 PIPAPO-CREW#2
Mit der Thread Klasse!
[Only registered and activated users can see links. Click Here To Register...]

Code:
System.Threading.Thread newThread;
newThread = new System.Threading.Thread(Sleeper);
newThread.Start();

private void Sleeper()
{

Threading.Sleep(1000);
Console.Write("ready");

}
10/07/2013 02:21 Requi#3
So würde ich es gerne machen.
Aber ich möchte die Zeit individuell machen.
Also Parameter übergeben. Nur mit dieser Methode meckert VS ja rum.
10/07/2013 02:28 snow#4
Wie siehts aus mit Lambdas?
Code:
int time = 1000;
System.Threading.Thread newThread = new System.Threading.Thread(() => Sleeper(time));
das sollte funktionieren. Ansonsten kannst du ja mal hier im MSDN nachschauen, .Start() kannst du auch mit einem Objekt als Parameter aufrufen: [Only registered and activated users can see links. Click Here To Register...]
10/07/2013 02:44 Requi#5
Danke schonmal.

Aber in meinem Code scheint was nicht zu stimmen. Also jetzt nichts mehr mit dem Sleep.

Code:
ElseIf content.StartsWith("S|CFG|1") Then
                If canSwitch = True Then
                    Me.Send("0|S|CFG|1")
                    canSwitch = False
                    Dim newThread As New System.Threading.Thread(Sub() AsyncSleep(5000))
                    newThread.Start()
                    canSwitch = True
                Else
                    Me.Send("0|A|STD|You have to wait 5 seconds after the last change")
                End If
            ElseIf content.StartsWith("S|CFG|2") Then
                If canSwitch = True Then
                    Me.Send("0|S|CFG|2")
                    canSwitch = False
                    Dim newThread As New System.Threading.Thread(Sub() AsyncSleep(5000))
                    canSwitch = True
                    newThread.Start()
                Else
                    Me.Send("0|A|STD|You have to wait 5 seconds after the last change")
                End If
            End If
Kleine Erklärung:
Es gibt 2 Konfigurationen auf einem PServer. Wenn er die erste wählen will, soll er überprüfen, ob er das auch darf. Hab oben einen Boolean auf True gesetzt.
Falls er darf, soll er ihn auf false setzen und dann switchen.
Falls nicht, soll er eine Meldung ingame ausspucken.

Ich kann aber ohne Probleme zwischen den Konfigurationen switchen.
10/07/2013 12:16 dready#6
Mh, ohne Garantie aber so vom drüberschauen, du erstellst einen neuen Thread

Dim newThread As New System.Threading.Thread(Sub() AsyncSleep(5000))

Dieser wartet vermutlich auch seine 5 Sekunden, aber das ist ja garnicht was du willst, der Witz an Threads ist ja gerade das der aufrufende Thread weiterläuft sobald er den neuen Thread gestartet hat ;)

Mh also etwa so

Thread 1: if abfrage --> bool setzen -> thread starten -> bool setzen ->ende
Thread 2: 5 Sekunden warten ------------------> ende

Thread 2 läuft praktisch Zeitgleich mit dem ersten.
Hoffe du verstehst was ich meine
10/07/2013 12:57 Requi#7
Du meinst, dass der Sleep ausgeführt wird, nur die Konsole nichts davon mitbekommt und sofort wieder auf true setzt?
10/07/2013 13:54 th0rex#8
Dein neuer Thread muss den Bool setzen und ggf das packet senden. Sollte eig klappen. Und die Konsole bekommt das mit das der Thread gemacht wird, aber sie wartet nicht bis der Thread zu Ende ist. Nur der Thread wartet 5 sek, aber die Konsole setzt nach ~0.1 Sek den Wert wd auf True.
10/07/2013 14:09 Requi#9
Der Sleep muss aber auch woanders genutzt werden können.
Wie könnte man das dann lösen?
10/07/2013 14:12 Easy-Emu#10
Da ich nicht gerne ganze codeteile poste nur mal ne andere kleine sache:

1. Task.Delay(time)
2. ContinueWith....

sehr praktisch und nutzt automatisch die ThreadPool klasse aus und bei anderne wuenschbaren settings kann man diese noch setzten (mal bissle mit der netten Task Klasse und async in .net 4.5 beschaeftigen).

Das ganze erspart einem nacher genug aerger
10/07/2013 14:12 th0rex#11
Wie woanders genutzt werden ? Kannst doch viel threads machen für verschiedene Sachen :P ist nur resourcenlastig aber mir ist auch keine andere Lösung bei dem pserver eingefallen. Ich kann nacher mal paar Leute fragen die sowas eig können sollten :) Muss dafür aba erstmal aus der Schule raus xD

Edit : bessere Antwort schon gepostet....
10/07/2013 14:22 Requi#12
Mit woanders, meine ich, dass das AsyncSleep nicht nur dafür genutzt werden soll.
Und 500 neue Subs wäre auch nicht geil :D

Das habe ich nun jedenfalls gelöst. Danke euch.

@omitma.
Gleiche Packets wie beim altem VB Emu. Läuft in der Konsole problemlos :p
10/07/2013 15:23 Schlüsselbein#13
Drück dich mal klar aus was du erreichen willst. Nicht wie du es erreichen willst. Dein Weg scheint mir ziemlich suspekt.
10/07/2013 16:37 th0rex#14
Er will, dass wenn jemand im Client etwas nutzt und sein Server das packet dafür bekommt, dass dann ein wert geprüft wird ob er denn in dem Falle die Configuration ändern kann oder nicht. Falls er sie ändern kann, soll sie geändert werden, ein bool, der angibt ob sie geändert werden kann, auf false gesetzt werden und nach 5 Sek soll dieser bool wieder zu true werden. Er kann nicht einfach Sleep in der else if content... abfrage machen, da dann alle ankommenden packet nicht verarbeitet werden. Falls es halt nicht für Configuration ist, z.b. für irgendeinen skill soll ein anderer bool geprüft werden. Bei dem Server müssen relativ viele cooldowns für nur einen Spiele gecheckt werden. (Ich GLAUBE deswegen möchte er nicht immer einen neuen thread erstellen wenn ein spieler einen skill nutzt. Da kann man aber glaube ich nicht viel anders machen.) Seine letzte Frage war jetzt ob es denn irgendwie Resourcen sparender gehen könnte anstatt 500 (oder mehr) threads am laufen zu haben. Hoffe du hast sein Problem jetzt einigermaßen verstanden.

@Requi wenn ich davon was falsch verstanden hab korigiere mich bitte ^^
10/07/2013 17:54 xxfabbelxx#15
closed on request