2016-12-01 7 views
0

データベースの変更を別のスレッドで更新したいのですが、100を超えるセルの値を変更すると、フォームは数秒間フリーズします。C#dataGridViewは別のスレッドでデータベースへの変更を更新します

は、私は解決策の多くをしようと、私はいつも、すでに最初に閉じる必要があります。このConnection に関連したオープンDataReaderあり、このエラー

を取得しました。

どうすればこの問題を解決できますか?このコードで更新されたデータベースをスレッディングなし

private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e) 
{ 
    try 
    { 
     DataTable changes = ((DataTable)dataGridView1.DataSource).GetChanges(); 

     if (changes != null) 
     { 
      MySqlCommandBuilder mcb = new MySqlCommandBuilder(mySqlDataAdapter); 
      ((DataTable)dataGridView1.DataSource).AcceptChanges(); 
      mySqlDataAdapter.UpdateCommand = mcb.GetUpdateCommand(); 
      mySqlDataAdapter.Update(changes); 
     } 
    } 
    catch (Exception _ex) 
    { 
     MessageBox.Show(_ex.ToString()); 
    } 
} 

答えて

-1

このような何か試してください:あなたはupdateChanges()関数内の任意のUIコンポーネントを更新する場合に使用する必要があります、しかし

Thread thread = new Thread(updateChanges); 
thread.Start(); 

private void updateChanges() 
{ 
    //here your code to update changes.   
} 

をInvokeRequired。すでにあなたは、データベースへの既存の接続を閉じる必要があり

最初に閉じる必要があります。このConnectionに関連したオープンDataReaderあり

、:

0

は、あなたが持っているエラーメッセージは完全に簡単ですそれを開いた状態にしておくべきではありません。これは、明らかにしない接続やアダプタを閉じる(または破棄する)ことで行うことができます。

また、データベースロジックをUIから削除する必要があります。これはひどいデザインです。いくつかのイベントをバックグラウンドで処理したい場合は、async/awaitasynchronous event handlerを、背景にはTaskを発射することができます。

関連する問題