Neu zu c# Ich habe in dieses "Rätsel" laufen, wenn ein SqlDataReader zwischen verschiedenen Threads weitergeben. Ohne zu sehr ins Detail zu gehen, ist die Idee, einen Hauptthread zu haben, der Daten aus der Datenbank abruft (einen großen Datensatz) und dann eine Helper-Task durch diese Datensatz für Datensatz und tun einige Dinge auf der Grundlage der Inhalte dieser laufen. Es gibt keine Rückmeldung an den Datensatz, es wird einfach durchgewühlt, bis keine Datensätze mehr übrig sind. Das funktioniert gut, aber angesichts der Art der Aufgabe sollte es möglich sein, diese Aufgabe auf verschiedene Threads (CPUs) zu verteilen, um den Durchsatz zu maximieren (die Reihenfolge der Ausführung ist nicht von Bedeutung). Die Frage ist nun, ob ich ref verwenden muss, wenn ich diesen Datensatz in einem SqlDataReader übergebe oder nicht? Es läuft auf die Frage hinaus: Wenn ich das Objekt ohne Angabe von ref weitergebe, werden dann nicht neue Kopien im Speicher erstellt und die Datensätze n-mal verarbeitet? Oder riskiere ich nicht, dass die Position des Datensatzes nach vorne verschoben wird, während noch nicht alle Felder vollständig gelesen wurden? Letzteres scheint eher ein Problem des "Datenrennens" zu sein und ist wahrscheinlich durch den lock()ing-Mechanismus abgedeckt (oder nicht?).
Mein erster Gedanke zu diesem Problem war, dass es nicht wirklich weh tut, die Variable mit ref zu übergeben, aber wie ein Kollege es ausdrückte: "Du brauchst ref nur, wenn du etwas falsch machst" =) Außerdem schränkt die Verwendung von ref die Möglichkeit ein, eine Using()-Konstruktion zu verwenden, was auch nicht sehr schön ist. Ich habe also ein "einfaches" Projekt erstellt, das den gleichen Ansatz verfolgt, aber ohne die ref-Notation. Die bisherigen Tests zeigen, dass es auf einem Core2Duo (2cpu) mit einer beliebigen Anzahl von Threads einwandfrei funktioniert, aber ich bin immer noch ein bisschen misstrauisch... Was denken Sie als Experten darüber? Ref verwenden oder nicht?
Sie finden das Testprojekt aquí da ich sie anscheinend nicht direkt in diese Frage hochladen kann?!?
ps: es ist nur ein Test-Projekt und ich bin neu in c#, so bitte sanft auf mich sein, wenn Aufschlüsselung der Code =P