2011-06-23 19 views
0

私はWPFアプリケーションをC#で作成しました。ここでmysqlデータベースからデータを取得する必要があります。この1つのODBC 3.51コネクタにデータをロードするとアプリケーションがフリーズします。 私はthread.Butを使ってこの問題を解決しようとしていますが、スレッドを使ってこれを行うことはできません。私の問題を解決する方法を提案してください...wpfフォームがデータベースからデータを取得するとフリーズする

答えて

2

BackgroundWorkerクラスを使用してください。使い方はとてもシンプルで、データのロードなどのタスクで頻繁に使用されます。次の例はあなたを示し、それは使い方です:

BackgroundWorker bgWorker = new BackgroundWorker() { WorkerReportsProgress=true}; 
bgWorker.DoWork += (s, e) => {  
    // Load here your data  
    // Use bgWorker.ReportProgress(); to report the current progress 
}; 
bgWorker.ProgressChanged+=(s,e)=>{  
    // Here you will be informed about progress and here it is save to change/show progress. 
    // You can access from here savely a ProgressBars or another control. 
}; 
bgWorker.RunWorkerCompleted += (s, e) => {  
// Here you will be informed if the job is done. 
// Use this event to unlock your gui 
}; 
bgWorker.RunWorkerAsync(); 

のBackgroundWorkerの使用は、UIスレッドは、それが処理ですので、アプリケーションがロード中に応答かかって続けることができます。しかし、このため、ロードされたデータに依存するアクションが発生しないようにする必要もあります。非常に簡単な解決策は、主UI要素のIsEnabled-propertyをfalseに設定し、RunWorkerCompletedでtrueに設定することです。ちょっとした幻想では、あなたはこのダムの動きを(アプリに応じて)素敵なUI体験に改善することができます。

一般的に、別のスレッド(BackgroundWorker)で長時間の操作を行うのは良いアドバイスです。 1つの注意点があります:DoWorkイベントでWPF-Elementsを作成しないでください。これは、派生したすべてのタイプのDependencyObjectを使用されている同じスレッドで作成する必要があるため実行されません。

スレッドやイベントベースの非同期パターンを直接作成するなどの他の解決策がありますが、配管工事のためにHandelを使用するため、BackgroundWorkerを使用することをお勧めします。結局のところ、結果は同じですが、その方法はずっと簡単です。

+0

ありがとうございます。私のアプリケーションにバックグラウンドワーカーを追加しようとしています。 – hmlasnk

+0

@Hemal:この回答が役に立った場合は、投票ボタンの下にあるチェックマークをクリックして、この回答を受け入れられた回答としてマークしてください。 – HCL

+0

このコメントはグレードです。もう一度大変ありがとうございます。 – hmlasnk

関連する問題