2011-08-07 7 views
-2

私はスレッドを使用しようとしていますが、何か問題があります(私はスレッド時に初心者です)マルチスレッド情報

私のコードはそうです。私は、フォーム内のデータセットを持っていると私は、データベースとクレタアダプタから、フォーム内のデータセットfiilいくつかtablequeryを取得したい

Dataset mydataset=new DataSet(); 
private void Form_Load(object sender,eventargs e) 
{ 
    SqlConnection con=new SqlConnection("constring"); 
    SqlDataAdapter adap=new SqlDataAdapter("select * from Tables"); 
    DataTable dt=new DataTable(); 
    adap.Fill(dt); 

    foreach(DataRow dr in dt.Rows) 
    { 
     ThreadStarter mystarter=delegate{ CreateTable(dr); }; 
     Thread mythread=new Thread(); 
     mythread.Start(); 
    } 
} 

void CreateTable(DataRow dr) 
{ 
    SqlDataAdapter adap2=new SqlDataAdapter(dr["Query"].toString(),con); 
    ada2.Fiil(myDataSet); 
} 

最初閉じため、すでにSqlDataReaderのがある」のように、私はエラーを取得する.Iこのコードを使用する場合" どうすればいいですか?

+2

「私のようなエラーが表示されます」 - 実際のエラーを教えてもらえますか? – JosephH

+5

貼り付けられたコードがどのようにコンパイルされていても働くことができるのだろうかと思います。 ThreadStarterはThreadStartDelegateで、新しいThread()は新しいスレッド(mystarter)で、Form_Loaded()で宣言された "con"変数を使用しようとしていて、別のスレッドで呼び出された別の関数でそのスレッドにアクセスしています。 –

答えて

1

私はあなたがここで何をしようとしているのかを説明する必要があると思います。あなたはテーブルのリストを開いて、すべてのデータをすべてのテーブルから並列にロードしようとしていますが、すべて同じオブジェクトにロードしようとしているようです。それは意味をなさないものです。

エラーが発生した場合、同じデータベース接続を同時に使用する複数のデータアダプタを作成しているように見えます。これを行うことはできません。このデータをすべて並列にロードしたい場合は、データベースに複数の接続を行う必要があります。

1

SqlConnection接続では、一度に1つのコマンド(および1つのリーダー)のみをサポートします。複数のスレッドで同時にアクセスすることはできません。したがって、スレッドごとにseparae SqlConnectionインスタンスを作成する必要があります。