Frage

Ich habe gelesen, und sah eine ganz wenige Beispiele für Threadpooling aber ich kann nicht scheinen, nur um es zu verstehen, dass sie Art und Weise muss ich. Was ich verwalten zu bekommen funktioniert nicht wirklich, was ich brauche. Es läuft nur die Funktion in einem eigenen Thread.

public static void Main()
    {
        while (true)
        {
            try
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(Process));
                Console.WriteLine("ID has been queued for fetching");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
            Console.ReadLine();
        }
    }

public static void Process(object state)
{

    var s = StatsFecther("byId", "0"); //returns all player stats
    Console.WriteLine("Account: " + s.nickname);
    Console.WriteLine("ID: " + s.account_id);
    Console.ReadLine();
}

Was ich versuche zu tun hat, etwa 50 Fäden gehen (vielleicht auch mehr), die serialisierten PHP-Daten enthalten Spielerstatistik holen. Ausgehend vom Benutzer 0 der ganzen Weg bis zu einer Benutzer-ID i angeben (300.000). Meine Frage ist nicht, wie die Statistiken holen Ich weiß, wie die Statistiken zu erhalten und lesen sie, aber, wie ich eine Thread schreiben, die Statistiken zu holen halten, bis es die Benutzer-ID 300.000ste ohne Treten auf den Zehen der anderen Fäden bekommt und speichert die Statistiken, wie es sie in einer Datenbank abgerufen werden.

War es hilfreich?

Lösung

static int _globalId = 0;
public static void Process(object state)
{    
  // each queued Process call gets its own player ID to fetch
  processId = InterlockedIncrement(ref _globalId); 
  var s = StatsFecther("byId", processId); //returns all player stats 

  Console.WriteLine("Account: " + s.nickname);    
  Console.WriteLine("ID: " + s.account_id);    
  Console.ReadLine();
}

Dies ist die einfachste Sache zu tun. Aber bei weitem nicht optimal. Sie verwenden synchrone Aufrufe, Sie auf der Thread setzen Ihre Anrufrate zu drosseln, haben Sie keine Wiederholungs Politik für gescheiterte Anrufe und Ihre Anwendung verhält sich extrem schlecht unter Fehlerbedingungen (wenn die Web-Anrufe werden nicht an).

Als erstes sollten Sie mit den Asynchron-Methoden von WebRequest betrachten: BeginGetRequestStream (wenn Sie POST und eine Anfrage Körper) und / oder BeginGetResponse . Diese Methoden skalieren viel besser, und Sie werden einen höheren Durchsatz für weniger CPU (wenn das hintere Ende nach oben natürlich halten kann).

Zweitens sollten Sie selbst throthling betrachten. Auf einem ähnlichen Projekt habe ich eine ausstehende Anforderung zählen. Bei Erfolg würde einreichen jeder Anruf 2 weitere Anrufe, mit der throtling Zahl begrenzt. Bei einem Fehler würde der Anruf nichts vor. Wenn keine Anrufe anstehen, eine Timer-basierte Wiederholungs legt einen neuen Anruf pro Minute. Auf diese Weise kann nur einmal pro Minute versuchen, wenn der Dienst nicht erreichbar ist, das Speichern Ihre eigenen Ressourcen von Spinnen w / o Traktion, und Sie den Durchsatz bis zur throtling Kappe erhöhen zurück, wenn der Dienst aktiv ist.

Sie sollten auch wissen, dass das .NET Framework die Anzahl der concurent conncetions begrenzen wird es auf jede Ressource macht. Sie müssen Ihr Ziel Servicepoint und Veränderung finden die ConnectionLimit vom Standardwert (2 ) mit dem Maximalwert sind Sie bereit, auf drosseln.

Über die Datenbank-Update Teil, gibt es viel zu viele Variablen im Spiel und viel zu wenig Informationen jede meaningfull Ratschläge zu geben. Einige allgemeinen Ratschläge würden die Verwendung asynchrone Methoden in der Datenbank Aufruf sein auch, Größe yoru conneciton Pool für Ihre throtling Kappe zu ermöglichen, stellen Sie sicher, dass Updates die Spieler-ID als Schlüssel verwenden, so dass Sie den gleichen Datensatz Deadlock nicht von verschiedenen Threads zur Aktualisierung .

Andere Tipps

Wie bestimmen Sie die Benutzer-ID? Eine Möglichkeit ist, zu segmentieren alle Fäden, so dass Thread X beschäftigt sich mit IDs von 0 -. N, und so weiter, als ein Bruchteil, wie viele Threads Sie haben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top