2009-06-17 12 views
1

Microsoft.SqlServer.Management.Smo.Restoreオブジェクトを使用してSQL Server 2000データベースを復元しようとしています。復元操作を開始する直前に、ラベルのテキストを変更して、ユーザーが何が起こっているかを知るようにします。ただし、変更されたテキストは、fullRestore.Wait()行の後まで、GUIで表示されません(つまり、テキストは元のままです)。奇妙なことは、lblStatusが最終的表示は「データベースの復元」んですが、ない後までLabel.Text変更がブロックされていますか?

lblStatus.Text = "Restoring Database"; 
Restore fullRestore = new Restore(); 

// Configure fullRestore 

fullRestore.SqlRestore(_server); 
fullRestore.Wait(); 

復元完了です。何か案は?

答えて

2

GUIスレッドをブロックしているため、更新できません。 lblStatus.Refresh()を呼び出すか、Waitをバックグラウンドスレッドに移動することができます(最終的には正しいことです)。

+0

は、任意の違いをすることはありませんlblStatus.Refreshを()の呼び出しを使用、それは意志ように制御を無効にすることができますGUIスレッドが利用可能になるまで、実際の再描画はまだ起こりません。 –

+0

@Simon - GUIスレッドをロックしている呼び出しの前に再描画します。 –

+0

興味深いことに、私はlblStatus.Refresh()を試してみました。私は、Wait()のバックグラウンドスレッドがより良い解決策になることを知っていますが、これは十分に簡単で現在は機能しています。 – Donut

0

スレッドの問題です。別のスレッドやバックグラウンドスレッドでこれを行うことができます。私が人々が使用するのを見た1つのアプローチは、通常はその呼び出しから離れていますが、Application.DoEvents()です。

0

フォアグラウンドスレッドでの処理が終了してリリースされるまで、GUIへの更新は実行できません。フォアグラウンド・スレッドがGUIの更新を継続できるようにするには、バックグラウンド・スレッドでリストアする必要があります。復元コードを別のメソッドに入れて、ThreadPool.QueueUserWorkItem()を使用し、復元メソッドを渡すことを検討してください。これにより、スレッドプールスレッドでの復元方法がトリガーされます。

それが終わったときに、スレッドと通知をより細かく制御する必要がある場合は、しても、そのすべてがある、BackgroundWorker

関連する問題