4

我的 C# 应用程序在系统启动时运行,必须等待本地 SQL Server 实例才能真正执行任何操作。现在,我只是等待服务器响应(我曾经在服务上获得一个等待句柄,但这并不可靠),然后启动应用程序的主对话框。

当然,这样做的问题是,在服务启动之前,用户无法知道正在发生的事情,并且由于我们使用的硬件可能需要一分钟。所以我正在考虑加入某种“正在加载/请等待”指示器。问题是,我们的项目接近于锁定,而像创建一个新类这样大的变化会引起很多麻烦——修改现有文件(如 Program.cs)比创建一个新文件要少得多。长话短说:在我开始连接 SQL Server 之前,是否有一个非常适合显示(我猜是异步的)的 .NET 类,然后在它开始响应时将其删除?

4

4 回答 4

5

这是我快速破解的三线程版本,可以解决问题。这可以以可见形式放置在任何地方(或者可以针对 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”的人,同意彻底考虑切换到一个健全的项目管理方法,该方法允许在执行阶段向项目添加额外的类。我知道类似纳粹的变更控制对所有相关方都是不健康的。

于 2009-04-01T03:53:27.557 回答
2

这是标准 Windows 进度对话框的 .NET 包装器:

http://www.codeproject.com/KB/shell/iprogressdialognet.aspx

我没有弄乱它,但我确信有一个标志可以使进度条旋转。如果您想变得非常花哨,您甚至可以制作自己的 AVI 动画并将其插入。

于 2009-03-30T19:15:25.547 回答
1

就像构建“请稍候...”对话框一样简单,我不明白为什么。

据我所知,没有。没有现货的。自己成长几乎更容易......或者只是禁用表格,然后调出沙漏光标。相同的想法,并且同样易于实施。

于 2009-03-30T21:47:52.543 回答
0

您可以考虑在 BackgroundWorker 中(在工作线程中)执行 SQL 工作。这将使您的应用程序响应。

于 2009-03-31T17:31:29.970 回答