質問

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"を表示しますが、復元が完了するまで 表示されません。アイデアはありますか?

役に立ちましたか?

解決

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

他のヒント

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

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

スレッドとスレッドの終了をより詳細に制御する必要がある場合は、 BackgroundWorker

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top