Was ist der beste Weg, um zu verzögern, eine Konsole-Anwendung für ein paar Sekunden

Übersicht.

Ich habe einen Windows Service in C# geschrieben .NET 4.0, das einbinden in die Betfair API, um Wetten zu legen automatisch (alle Wetten Entscheidungen sind gemacht in der SQL-DB). Der service hat die Anzahl der Zeitgeber, der festlegt, bis einige polling für die 3 Haupt-Bereiche (Ort, ausstehende Wetten, prüfen Sie die Preise, statt in-Spiel-Wetten [während des Rennens]). Die Timer sind alle ausgelöst, der alle 30 Sekunden.

Bin ich Schwierigkeiten haben, ist das InPlay Wetten. Einmal alle 30 Sekunden wird der timer ruft eine Methode in meinem BetfairBot Objekt, das überprüft, für die bevorstehenden Rennen, die inplay-Wetten für Sie. Es könnten mehrere Systeme Wetten auf die gleiche Rasse so wollte ich das Feuer aus der "control" - Methode in parallel so ein system nicht zu warten, für die anderen zu beenden, bevor Sie in der Lage, seine Wetten.

So, ich habe einige code, wie das Feuer aus der parallel-Steuerung Methoden

//some SQL to get my upcoming races
DataTable sqlRecordset = this.dataAccess.GetDataTable(SQL);

try
{

//run in parallel for each system and concurrent races

Parallel.ForEach(sqlRecordset.AsEnumerable(), recordsetRow =>
{

    betfairLogon = recordsetRow["BetfairLogon"].ToString();
    betfairPassword = recordsetRow["BetfairPassword"].ToString();
    SystemPK = Convert.ToInt32(recordsetRow["SystemPK"]);
    systemName = recordsetRow["SystemName"].ToString();
    RacePK = Convert.ToInt32(recordsetRow["RaceFK"]);

    //spawn thread for each system    
    this.RunInPlayBettingControl(SystemPK, betfairLogon, betfairPassword, systemName, RacePK);

});


}
catch (Exception e)
{
//log error
HelperLib.LogMsg("Error starting Parallel Threads for RacePK: " + RacePK.ToString() + " - " +e.Message.ToString());
}

Dann in meinem control-Methode, die ich Durchlaufen, bis die Wette auf, den Aufruf einer anderen Methode, die Griffe, die Wetten und liefert einen Ergebnis-code sagen, mein system den status der Wetten-z.B., ob das Rennen beendet ist, noch nicht angefangen, oder einfach nur zu starten.

Auf ein paar dieser Zustände, die ich will, zu verzögern, meinen thread für ein paar Sekunden, bevor Sie erneut aufrufen der Wetten Methode.

Habe ich versucht

Thread.Sleep(2500);

Aber nicht warten, und, die Wetten-proc wird aufgerufen, sich sofort wieder, ohne Wartezeit.

Las ich etwas über threading und ich weiß nicht, ob das problem mit der Parallelen Schleife, die Trigger parallel Anrufe meiner Kontrolle Methode (die Verzögerung der thread-on-demand) oder mit meiner Kontrolle Methode und den Thread.Sleep(delay) - Aufruf.

Meinen ersten Timer, die in der Service-Klasse gut funktioniert und ich weiß nicht, der beste Weg zu gehen über das oder was ist das problem mit der Verzögerung, wie ich vermutete, in jedem Thread initiiert von der Parallelen Schleife laufen würde, auf seine eigene, und daher verzögert ein .Sleep-Aufruf, falls erforderlich.

Sollte ich mehr Timer ODER eine andere Methode, und was ist der beste Weg, mit meinen vorhandenen loop-code?

Die Control-Methode ausgelöst durch die Parallele Schleife unten. Der code für das eigentliche Wetten Methode ist zu kompliziert, das hier zu posten aber es hat keine thread-Aufrufe nur einige SQL und einige Aufrufe an die Betfair API.

Jede Hilfe wäre sehr geschätzt werden. Vielen Dank im Voraus.

public void RunInPlayBettingControl(int SystemPK,string betfairLogon, string betfairPassword, string systemName, int RacePK)
{
int result = 0;
bool quit = false; //we loop until true

//decode our encrypted logon details
betfairPassword = HelperLib.GetPassword(betfairLogon);
betfairLogon = HelperLib.DecodeLogon(betfairLogon);

//create API object
this.betfairAPI = new BetfairAPI(systemName);

//try and log in for this system and save the session for future use

if (!String.IsNullOrEmpty(betfairLogon) && !String.IsNullOrEmpty(betfairPassword))
{

//check logged in status as we might have used previous session otherwise log in now
if (!this.betfairAPI.IsLoggedIn() && this.betfairAPI.Login(betfairLogon, betfairPassword) == false)
{
    //couldnt login so exit
    return;
}
else
{                  

    //save session to file
    this.betfairAPI.SaveSession(systemName);

    //we loop until we know there is no more point in doing so
    while (!quit)
    {
    //result code values
    //0 = We have no idea whats going on yet
    //1 = Race is actually closed/finished so exit
    //2 = Race is inplay but we are not ready to bet yet - wait a short while
    //3 = Race is inplay and ready to bet
    //4 = Race is not inplay yet so wait a bit and carry on

    //this is our main betting method that handles all our betting
    result = this.RunInPlayBetting(SystemPK, betfairLogon, betfairPassword, systemName, RacePK);

    //check result to see if we quit looping
    switch (result)
    {
        case 1:
        //race is over so exit
        quit = true;
        break;
        case 2:
        //race is in play but not over our marker yet so go back in after a short wait
         Thread.Sleep(1000);  //NOT WORKING
        quit = false;

        break;
        case 3:
        //race is in play so lets go straight back in and try some more betting
        quit = false; 
        break;
        case 4:
        //not in play yet so keep looping after a short wait
        quit = false;

        Thread.Sleep(2500); //NOT WORKING

        break;

        case 0:
        //have no idea whats going just quit loop
        quit = true;
        break;

    }
    }
}

}   

return;
}
statt zu schlafen, warum nicht einfach einen timer einrichten aufgerufen werden, wenn Sie fortfahren möchten, die Aktion.
Hi, wie sehen Sie, dass die Arbeit in den Kontext meiner while-Schleife. Ein timer in der control-Methode, die rekursiv ruft sich selbst auf bestimmte status-codes oder einer kompletten überarbeitung mit einem neuen Ansatz und wenn ja, welche Vorgehensweise empfehlen Sie? Auch würde ich gerne wissen, für meine eigene geistige Gesundheit Willen, warum der Thread erzeugt, der von der Parallelen Schleife nicht Geschlafen?
thread.Schlaf sollte es tun...
aber es funktioniert nicht wie das ist, was ich Tue im moment.

InformationsquelleAutor Monkey Magix | 2012-01-30

Schreibe einen Kommentar