2009-04-03 6 views
0

私は、ローカルデータベースからデータを表示するウィンドウフォームを持っています。バックグラウンドスレッドでリモートサーバー上のデータベースに接続するにはどうすればよいですか?

リモートデータベースに接続してそこから他のデータを表示したいと思っていますが、このリモートデータベースがダウンしているか遅いことがあります。

このリモートデータベースに接続しようとすると、UIがフリーズすることはありません。だから、スレッドまたはスレッドの安全性については何も知りません

は、ここに私のhamfisted例です:

RemoteDataContext rdt; 

private void GetRemoteDataContext() { 
    rdt = new RemoteDataContext(RemoteServerConnectionString); 
} 

private void FillFromRemoteDataContext() { 
    lblTest.text = rdt.TestTable.First().TestField; 
} 

private void Form1_Shown(object sender, EventArgs e) { 
    Thread t = new Thread(new ThreadStart(new delegate { 
     try { 
      GetRemoteDataContext(); 
      FillFromRemoteDataContext(); 
     } catch { } // ignore connection errors, just don't display data 
    ); 
    t.Start; 
} 

だから、あなたはそれが私がacheiveしたいことは何かとは言うことができるはずです。

私の質問は、正しい方法は何ですか?


更新:人は、今私は(Form1Shownに)持っているありがとう:

BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork += new DoWorkEventHandler((sender, e) => { 
    e.Result = null; 
    try { 
     e.Result = new RemoteDataContext(RemoteServerConnectionString); 
    } catch { } // ignore connection errors, just don't display data 
}); 
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler((sender, e) => { 
    if (e.Result != null) { 
     rdt = (RemoteDataContext)e.Result; 
     FillFromRemoteDataContext();    
    } 
}); 
bw.RunWorkerAsync(); 

そして、それが動作し、限り私はそれを理解し、何のスレッド関連のエラーがあってはなりません。

答えて

2

BackgroundWorkerクラスをチェックすると、作業が楽になります。

進捗報告とスレッド完了のために、実際の作業に代理人を指定するだけで済みます。

+0

私はこの質問をしたとき、私は '私はと呼ばれるクラスの中に上記のコードを抽象化の真ん中にあったほら、 「BackgroundWorker」 – Blorgbeard

+0

私はそれがすでに存在すると推測していたはずです。 – Blorgbeard

1

私のやり方に沿っていますが、データベース接続が成功し、UIを更新する必要がある場合は、スレッド間のアクセスが問題になります。 CMSが示すように、BackgroundWorkerクラスを使用して、クロススレッドマーシャリングを処理することができます。私は、よりきめの細かい制御のために行く傾向があると私はあなたに例を実装します:

RemoteDataContext rdt; 
private void GetRemoteDataContext() {  
    rdt = new RemoteDataContext(RemoteServerConnectionString); 
} 
private void FillFromRemoteDataContext() { 
    if (lblTest.Dispatcher.Thread != Thread.CurrentThread) { 
     lblTest.Dispatcher.Invoke(delegate { lblTest.text = rdt.TestTable.First().TestField}); 
    } 
    else { 
     lblTest.text = rdt.TestTable.First().TestField; 
    } 
} 
private void Form1_Shown(object sender, EventArgs e) {  
    ThreadPool.QueueUserWorkItem(delegate {   
     try {    
      GetRemoteDataContext();    
      FillFromRemoteDataContext();   
     } catch { } // ignore connection errors, just don't display data 
    });  
} 
+0

私は何かが恋しい、または私が投稿したコードと同じですか? – Blorgbeard

+0

申し訳ありませんが、コードをフォーマットするときに誤って入力します。例は今終わった。 – sipwiz

+0

興味深いですが、できる限りフレームワークにスレッド処理の多くを残しておく方がよいと思います。P – Blorgbeard

関連する問題