これは、私がすぐにハックしたトリプルスレッドバージョンで、うまくいきます。これは、目に見えるフォームのどこにでもドロップできます (または、program.cs 用に変更できます)。親スレッドで FinishedProcessing が設定されるまで、スムーズにスクロールするプログレス バーを備えた新しい中央のモーダル ダイアログ ボックスが生成されます。真に。
//Update to true when finished loading or processing
bool FinishedProcessing = false;
System.Threading.AutoResetEvent DialogLoadedFlag
= new System.Threading.AutoResetEvent(false);
(new System.Threading.Thread(()=> {
Form StockWaitForm = new Form()
{ Name = "StockWaitForm", Text = "Please Wait...", ControlBox = false,
FormBorderStyle = FormBorderStyle.FixedDialog, StartPosition = FormStartPosition.CenterParent,
Width = 240, Height = 80, Enabled = true };
ProgressBar ScrollingBar = new ProgressBar()
{ Style = ProgressBarStyle.Marquee, Parent = StockWaitForm,
Dock = DockStyle.Fill, Enabled = true };
StockWaitForm.Load += new EventHandler((x, y) =>
{
DialogLoadedFlag.Set();
(new System.Threading.Thread(()=> {
while (FinishedProcessing == false) Application.DoEvents();
StockWaitForm.Invoke((MethodInvoker)(()=> StockWaitForm.Close()));
})).Start();
});
this.Invoke((MethodInvoker)(()=>StockWaitForm.ShowDialog(this)));
})).Start();
while (DialogLoadedFlag.WaitOne(100,true) == false) Application.DoEvents();
//
//Example Usage
//Faux Work - Have your local SQL server instance load here
for (int x = 0; x < 1000000; x++) int y = x + 2;
FinishedProcessing = true;
好みに合わせてカスタマイズ。また、本番アプリでこれを使用する場合は、新しいスレッドの内容を try...catch ブロックでCYAにラップします。最後に、このコードを「Coderer Public License / SO v1.1」の下で次のようにリリースします。
Coderer Public License / SO v1.0
コミュニティ「Stack Overflow」で「Coderer」として知られる私は、Executing フェーズで余分なクラスをプロジェクトに追加できる健全なプロジェクト管理方法への切り替えを徹底的に検討することに同意します。ナチスのような変更管理は、関係者全員にとって不健康であることを理解しています。