私は小さなジレンマを持っています。私は、独自の接続文字列(同じか異なる可能性があります)を持つデータセット内のクエリのリストを調べ、すべてのDataTablesを埋め込み、すべてのクエリを埋め込んだ塗りつぶしデータセットを返す関数を持っています。c#マルチスレッドデータベースの塗りつぶしテーブル
現在このプロセスは1つずつ実行されるため、クエリーの1つに10分かかり、残りの3つのクエリーにそれぞれ2分かかると、実行時間は16分になります。
この状況でマルチスレッドを使用できるかどうかは疑問でした。これは別のスレッドでFillTableをすべて呼び出す必要があり、実行時間を10分に短縮する必要があります。これらは、明示的にFill DataTable呼び出しのみです(更新または削除呼び出しはありません)。
これは私がこれまでに得たものである:
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);
}
}
}
ラムダ式は、(私はこれを変更することはできません)パラメータの参照を渡して好きではないので、私はTempSourceを作成する必要がありました。現在のところ、これは動作しません、私は間違っているか分からない。
**ジレンマ**は、2つの同等に悪い(または同等に良い)結果の間の選択です。あなたはジレンマを持っていないように思えます。解決したい問題だけです。 – Enigmativity
いずれにしても、データベース呼び出しがIOであり、スレッドがメモリ内のデータに対して最適に動作するため、スレッド化でパフォーマンスが向上する可能性はほとんどありません。既存のコードをスピードアップし、スレッド化が見えない状況を改善するかどうかを尋ねない方法があれば、本当に尋ねているはずです。 – Enigmativity
私はクエリを制御する必要はありません。私は各スレッドが同時に独自のクエリを実行して、各クエリが完了するのを本質的に待たないようにします。たとえば、スレッドごとに5分かかる5つのクエリがある場合、これは5分で25分以内に完了する必要があります。 –