Ich habe ein kleines Dilemma. Ich habe eine Funktion, die eine Liste von Abfragen in einem Dataset mit ihrer eigenen Verbindungszeichenfolge durchläuft (könnte gleich oder verschieden sein) und füllt alle DataTables aus und gibt ein gefülltes DataSet mit allen ausgefüllten Abfragen zurück.C# Multithread-Datenbank füllen Tabelle
Momentan Dieser Prozess wird nacheinander ausgeführt. Wenn eine der Abfragen 10 Minuten dauert und die anderen 3 Abfragen jeweils 2 Minuten dauern, beträgt die Laufzeit 16 Minuten.
Ich frage mich, ob es in dieser Situation möglich ist, Multithreading zu verwenden. Dies sollte FillTable alle auf separaten Thread aufrufen und sollte die Laufzeit auf 10 Minuten herunter. Dies sind explizit nur Fill DataTable-Aufrufe (es wird keine Aktualisierung geben oder Anrufe löschen).
Das ist, was ich bisher habe:
public void FillDataSet(ref DataSet Source)
{
foreach (var r in Source.Tables["queries"].Rows)
{
string query = r["QueryStatement"].ToString();
string qSource = r["QuerySource"].ToString();
string tableName = r["TableName"].ToString();
DBConnection db = new DBConnection();
var TempSource = Source;
taskConnection = Task.Factory.StartNew(() => callDB(db, query, tableName, ref TempSource));
Source = TempSource;
}
Task.WaitAll(taskConnection);
}
private void callDB(DBConnection db, string query, string tableName, ref DataSet Source)
{
using (var sql = new SqlConnection(db.ConnectionString))
{
sql.Open();
using (var adp = new SqlDataAdapter(query, sql))
{
adp.SelectCommand.CommandTimeout = 0;
adp.Fill(Source, tableName);
}
}
}
ich einen TempSource zu schaffen hatte, weil Lambda-Ausdruck in ref der Parameter nicht vorbei mag (ich das nicht ändern kann). Derzeit funktioniert das nicht, nicht sicher, was ich falsch mache.
Ein ** Dilemma ** ist eine Wahl zwischen zwei gleich schlechten (oder gleich guten) Ergebnissen. Du scheinst kein Dilemma zu haben, nur ein Problem, das du lösen willst. – Enigmativity
In jedem Fall ist es unwahrscheinlich, dass Sie beim Threading eine Leistungssteigerung erzielen, da Datenbankaufrufe IO sind und Threads am besten für Daten im Arbeitsspeicher funktionieren. Sie sollten uns wirklich fragen, ob es eine Möglichkeit gibt, Ihren bestehenden Code zu beschleunigen und uns nicht zu fragen, ob das Threading eine Situation verbessern könnte, die wir nicht sehen können. – Enigmativity
Ich habe keine Kontrolle über die Abfragen. Lange Rede, kurzer Sinn Ich möchte, dass jeder Thread seine eigene Abfrage zur gleichen Zeit ausführt, damit sie nicht im Grunde darauf warten, dass alle Abfragen abgeschlossen sind. Zum Beispiel, wenn ich 5 Abfragen habe, die jeweils 5 Minuten durch Threading dauerte, sollte in der Lage sein, dies innerhalb von 5 Minuten vs 25 Minuten zu tun –