Frage

Ich habe zwei Threads, braucht man eine Reihe von separaten statischen Ressourcen für Updates suchen abzufragen. Der andere braucht, um die Daten zu erhalten und speichern sie in der Datenbank. Wie kann 1 sagen Gewinde Gewinde 2, dass es etwas zu verarbeiten?

War es hilfreich?

Lösung

Wenn die Stücke von Daten sind unabhängig behandeln dann die Stücke von Daten als Arbeitselemente durch einen Pool von Threads verarbeitet werden. Verwenden Sie den Thread-Pool und QueueUserWorkItem die Daten an den Faden zu schreiben (s). Sie sollten eine bessere Skalierbarkeit mit einem Pool von symmetrischen Fäden erhalten und die Menge der Synchronisation zu begrenzen, die zwischen dem Erzeuger und Verbraucher (s).

erfolgen muss

Zum Beispiel (von MSDN ):

    TaskInfo ti = new TaskInfo("This report displays the number {0}.", 42);

    // Queue the task and data.
    if (ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ti)) {    
        Console.WriteLine("Main thread does some work, then sleeps.");

        // If you comment out the Sleep, the main thread exits before
        // the ThreadPool task has a chance to run.  ThreadPool uses 
        // background threads, which do not keep the application 
        // running.  (This is a simple example of a race condition.)
        Thread.Sleep(1000);

        Console.WriteLine("Main thread exits.");
    }
    else {
        Console.WriteLine("Unable to queue ThreadPool request."); 
    }


// The thread procedure performs the independent task, in this case
// formatting and printing a very simple report.
//
static void ThreadProc(Object stateInfo) {
    TaskInfo ti = (TaskInfo) stateInfo;
    Console.WriteLine(ti.Boilerplate, ti.Value); 
}

Andere Tipps

Ich benutze Monitor.Wait / Pulse auf einer Warteschlange von Arbeitsaufgaben.

Ist der „Laden in der DB“ Thread immer ausgeführt werden muß? Es scheint, wie vielleicht die beste Option (wenn möglich) wäre den Polling-Thread Spin hat bis einen anderen Thread des Speichern zu tun. Je nach der Anzahl der Threads obwohl erstellt wird, könnte es, dass der Faden Verwendung ThreadPool.QueueUserWorkItem erste Abfrage mit () sein könnte desto effizienter Weg sein.

Für mehr Effizienz, wenn sie auf die Datenbank zu speichern, würde ich asynchrone I / O auf dem DB verwenden, anstatt die Synchronisationsmethoden.

Sie können jederzeit weg direkt zwischen zwei Threads kommunizieren aus mit, Sie sollten. Mit zusammen einig sync Primitiven zu werfen, nicht der Code zu debuggen sein, wie einfach und könnte einige sehr subtile Rennbedingungen einzuführen, die (zu finden / fix, den Spaß von weit sind) verursachen „einmal in einer Million Ausführung“ Typ Bugs.

Wenn der zweite Thread immer die Ausführung benötigt werden, lassen Sie uns wissen, warum mit etwas mehr Informationen, und wir können mit einer tiefen gehende Antwort zurückkommen.

Viel Glück!

Ich persönlich würde Thread 1 raise Ereignisse haben, die Gewinde 2 kann reagieren. Die Gewinde an den entsprechenden Ereignissen verdrahtet durch den Steuerprozess werden kann, die sowohl die Fäden einleitet.

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