title image


Smiley Schreibvorgänge in DataTable sycnhronisieren
Hi Leute,



ich bin erst seit ein paar Tagen mit C# am Start, habe aber reichlich Erfahrung mit Java und C++.

Nun stehe ich vor folgendem Problem:



Ich lasse in einem FolderBrowserDialog benutzerseitig ein Verzeichnis auswählen. Anschließend möchte ich alle

Verzeichniss und Unterverzeichnisse auslesen und alle darin befindlichen Dateien in ein DataTable Objekt übernehmen,

um dies in einem DataGrid Objekt im GUI anzuzeigen. So weit so gut.

Nun kann es aber u.U. passieren, dass ein Verzeichnis sehr viele Dateien enthält, weswegen ich die Routine zum Befüllen des DataTable Objektes in einen separaten Thread ausgeklinkt habe.

Das Problem ist nun, dass in der Zeile "this.fileDataTable.Rows.Add(row);" eine NullReferenceException ausgelöst wird.

Die Klasse DataRowCollection (Rows Eigenschaft des DataTable Objektes) sagt mir auch zum Thema Threadsicherheit, dass Lesevorgänge threadsicher seien, Schreibvorgänge jedoch synchronisiert werden müssten. Ich habe versucht dies mittels des lock Schlüsselwortes um diese Zeile zu bewerkstelligen. Leider ohne Erfolg. Die Ausnahme bleibt hartnäckig bestehen. Was mache ich falsch ?

Meine Kenntnisse zu C# sind so gut noch nicht. Vielleicht weiß ja jemand Abhilfe. Ich komme so einfach nicht weiter. Wäre toll, wenn mir jemand helfen könnte.









Hier die Klasse, deren doWork() Methode als Parameter für den ThreadStart Delegaten verwendet wird.





internal class FileGridUpdater {

private string dir;

private DataTable fileDataTable;

public FileGridUpdater(string dir, DataTable fileDataTable) {

this.dir = dir;

this.fileDataTable = fileDataTable;

}



public void doWork() {

this.updateFileTable(this.dir);

}



private void updateFileTable(string directory) {

DataRow row;

DirectoryInfo dirInfo = new DirectoryInfo(directory);



// add files in directory

FileInfo[] files = dirInfo.GetFiles();

foreach (FileInfo fInfo in files) {

if (!this.fileDataTable.Rows.Contains(fInfo)) {

// add new row

row = this.fileDataTable.NewRow();

row["File"] = fInfo;

row["Name"] = fInfo.Name;

row["Directory"] = fInfo.DirectoryName;

row["Size"] = FileShredderMainForm.convertFileSize(fInfo.Length);

row["Date"] = fInfo.LastWriteTime;

this.fileDataTable.Rows.Add(row);



} else {

// update existing row

row = this.fileDataTable.Rows.Find(fInfo);

row["File"] = fInfo;

row["Name"] = fInfo.Name;

row["Directory"] = fInfo.DirectoryName;

row["Size"] = FileShredderMainForm.convertFileSize(fInfo.Length);

row["Date"] = fInfo.LastWriteTime;

}

}

// add subdirectories in directory

DirectoryInfo[] subdirs = dirInfo.GetDirectories();

foreach (DirectoryInfo dInfo in subdirs) {

this.updateFileTable(dInfo.FullName);

}



this.fileDataTable.AcceptChanges();

//this.startButton.Enabled = files.Length > 0;

} // end method updateFileTable(string)

}





Duke  JCruiser
Viel Spaß in Spotlight.de

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: