Threadsafe methods + Gleichzeitige Datareads

kahuna

Erfahrenes Mitglied
Hallo,

Hach das Leben ist nicht einfach =D...

Ich schreibe gerade eine Applikation, in der intensiv Multithreading verwendet wird. Zuerst eine Verständnisfrage. Nehmen wir folgende Situation an:

Code:
private static readonly object padlock = new object();
private void ThreadSafeMethode()
{
    lock(padlock)
    {
          for(...)
          {
             this.SomeMethod();
          }
    }
}
private void SomeMethod()
{
    //some actions
}

Die obere Methode wird nun synchronisiert ausgeführt. Meine Frage ist nun, ob ich das richtig verstehe, dass die untere Methode unter Umständen nicht threadsicher ist.

Meine zweite Frage hat etwas mit der oberen zu tun.
Ich arbeite mit den System.Data.SqlClient um in Threads Daten abzufragen. Von Zeit zu Zeit kriege ich die Exception, dass mehrere Datareads gleichzeitig auf einer Verbindung ausgeführt wurden (was ja nicht verwunderlich ist, da die Threads sich überschneiden können). Wie kann ich dies verhindern. Doch nicht jedem Thread eine eigene Connection geben oder?

Gruss Alexander
 
Hallo kahuna!
Meine Frage ist nun, ob ich das richtig verstehe, dass die untere Methode unter Umständen nicht threadsicher ist.
Ganz gewiss.
Es können DeathLocks oder halt skurile Exceptions entstehen,
wenn versucht wird von mehreren Threads aus gleichzeitig auf ein Objekt zuzugreifen.

Du kannst dein DB Objekt via Singleton überall verfügbar machen und den Zugriff darauf Synchronisieren.
Das lock Statement repräsentiert die Methoden
Monitor.Enter( obj ) und Monitor.Exit( obj ). Innerhalb dieses Blocks wird sichergestellt,
dass immer nur ein Prozess zugriff auf die Objekte innerhalb der Methode hat.
[post=1135861]Singelton - Post[/post]


MfG,
cosmo
 
Wenn ich nun aber bewusst will, dass mehrere Threads gleichzeitig die Datenbank abfragen können, wie bewerkstellige ich dies?

Gruss Alexander
 
So was hab ich noch nicht gemacht. Vielleicht ist es mit merheren Connections möglich.
Aber das sollte lieber jemand beantworten der mit mehrerern gleichzeitigen DBZugriffen Erfahrung hat.
Es können da aber wahrscheinlich Inkonsistenzen enstehen, wenn Du Werte reinschreibst,
die wiederum von einem deiner anderen Thread benötigt werden.

Aber wie gesagt ich hab mich bisher immer nur auf eine Connection zu einer DB beschränkt.
Was musst den für riesige Datenmengen umsetzen, wenn man mal fragen darf?
 
wenn du den thread in eine eigene klasse packst:

Code:
class Worker
{
   private MySqlConnection con = null;

   public Worker()
   {
      con = new MySqlConnection(connectionString);
      con.Open();
      Thread workerThr = new Thread(new ThreadStart(run));
      workerThr.start();
   }


   private void run()
   {
      //hier kannst du jetzt auf con deine datenbank aktionen durchfuehren
      //da jeder thread seine eigene Verbindung hat 
   }
}

und einen neuen Thread startest du jetzt indem du einfach aus deinem Hauptprogramm ein neues Worker object erstellst
In den Worker kommt dann auch deine ganze logik rein, was der thread machen soll...

hoffe, das hat geholfen
 
Zurück