1

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

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

// Configure fullRestore

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

奇妙なことに、lblStatus は最終的に「Restoring Database」を表示しますが、復元が完了するまでは表示されませ。何か案は?

4

3 に答える 3

2

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

于 2009-06-17T21:06:18.953 に答える
0

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

于 2009-06-17T21:06:07.193 に答える
0

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

スレッドと終了時の通知をさらに制御する必要がある場合は、BackgroundWorkerを使用できます。

于 2009-06-17T21:14:31.293 に答える