Ich habe einen Thread, der regelmäßig eine meiner MS SQL-Tabellen für alle Datensätze überprüft, deren Bitfeld "Processed" auf 0 gesetzt ist. Der Thread führt dann Code aus Verwenden dieser Datensätze und setzt dann ihre verarbeiteten Bits auf 1; Verwenden Sie es im Grunde als eine Warteschlange. Die Linq-Abfrage, die ich diese Datensätze abzurufen bin mit erstreckt sich über mehrere Zeilen und ist ziemlich kompliziert (aus Gründen unwichtig für die Frage), so ist hier eine sehr vereinfachte Version:So verwenden Sie Linqs .Count() -Methode in einer bedingten Anweisung
var RecordsToProcess = MyTable.Where(i => i.Processed == 0); // Very simplified
ich, bis alle warten, um die Aufzeichnungen wurden, bevor Sie weiterverarbeitet, also würde ich so etwas wie dies nutzen möchten:
while (RecordsToProcess.Count() > 0)
{
System.Threading.Thread.Sleep(1000);
}
das Problem ist, dass während der Faden in der Tat Prozess die Aufzeichnungen und setzt ihre verarbeitete Bit auf 1, den Wert von RecordsToProcess. Count() in der Bedingungsanweisung nimmt niemals ab und somit erhalten wir eine Endlosschleife. Meine Schätzung ist, dass das Aufrufen von .Count() diese Ganzzahl im Speicher speichert und dann jede Iteration der Schleife diesen Wert untersucht, anstatt die Datenbank abzufragen, um die aktuelle Anzahl zu erhalten. Ich kann das Verhalten Ich möchte erhalten, indem die Abfrage in die Bedingungsanweisung bewegt wie so:
while (true)
{
if (MyTable.Where(i => i.Processed == 0).Count() > 0)
System.Threading.Thread.Sleep(1000);
else
break;
}
Da die Abfrage ich eigentlich in diesem Beispiel ist viel komplizierter als die Verwendung macht es auf diese Weise macht es schwer zu lesen. Kann ich etwas verwenden, das RecordsToProcess.Count()> 0 ähnlich ist, aber diese Datenbank jede Iteration abfragt, anstatt die Anfangszählung zu verwenden, die im Speicher gespeichert wurde (vorausgesetzt, dass ich richtig liege)?
Hinweis: Normalerweise würde ich keine potentiell gefährliche While-Schleife verwenden, aber ich muss diese Seite nur maximal 4 oder 5 Mal und dann nie wieder ausführen. Ich mache mir deswegen keine Sorgen.
„Meine Vermutung ist, dass Aufruf .Count() speichert, die ganze Zahl im Speicher“ - IIRC das erste Mal, wenn Sie 'RecordsToProcess.Count() aufrufen ',' RecordsToProcess' wird ausgewertet und das Ergebnis dieser Auswertung wird zwischengespeichert. Also hast du recht. Meine Lösung wäre "var count = MyTable.Where(). Blah(). Blah(). Long(). Query()' mit geeigneten Zeilenumbrüchen usw. für die Lesbarkeit, und dann "if (count> 0) {... } '- oder verstecken Sie den LINQ in einer Methode,' GetProcessedRecords() '. –
Alles hängt letztendlich von Ihrer 'RecordsToProcess' Abfrage ab. Sie sollten uns zeigen, was diese Abfrage ist. Sie haben es wahrscheinlich so geschrieben, dass es bereits ausgewertet ist. –
Natürlich sehe ich den Rest deines Codes nicht, aber kannst du nicht einfach auf den Thread warten? Oder nicht mal in einem anderen Thread? –