是否有“库存”闲置/等待对话框?

时间:2009-03-30 18:38:08

标签: c# winforms dialog

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

当然,问题在于,在服务启动之前,用户无法说出任何事情,而且由于我们使用的硬件可能需要一分钟。所以我想考虑某种“加载/请等待”指标。问题是,我们的项目接近锁定,并且像创建新类一样大的变化会引起很多麻烦 - 修改现有文件(如Program.cs)比创建新文件要少得多。简而言之:在我开始在SQL Server上进行plinking之前,是否有一个非常适合显示(异步,我猜)的.NET类,然后在它开始响应时被删除?

4 个答案:

答案 0 :(得分: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”的人,同意彻底考虑转换为一种理智的项目管理方法,允许在执行阶段将额外的类添加到项目中。我知道纳粹式的变更控制对所有相关方都是不健康的。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

就像“请稍候......”对话框一样简单,我无法理解为什么。

据我所知,没有。没有库存。增长自己几乎更容易......或者只是禁用表单,然后调出沙漏光标。同样的想法,也很容易实现。

答案 3 :(得分:0)

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