解决 SQL测试导致大量的表单加载时间

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
我注意到,在初始消息框请求用户确认新会话之后,我的表单需要一段时间才能加载。

查看它,似乎延迟发生在此部分:

Program.cs:

C#:
static void main()
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(fale);
    If (SqlTest(@"...connectionstring....")
        Application.Run(new Form1());
        
private static bool SqlTest(String connectionString)
        // check whether a connection has been made return false if no connection

现在,我喜欢正在测试连接的事实,但是我不喜欢在此过程中加载表单需要20秒钟(连接不是本地的)。这里有一个线程- 解决-只是关闭应用程序?

我第一次讨论问题的地方。

我希望加载该表单,如果sql测试失败,则提供一个消息框,然后关闭,因为没有该连接就不应该使用该表单-我只是认为加载应用程序很糟糕,然后什么也没发生一会儿....我宁愿加载它,然后在必要时引导用户退出并关闭。

考虑到我以前遇到的问题,我想我会问问是否有人有任何想法。谢谢。
 
Solution
您的SQL连接占用了主UI线程。通过在此处放置暂停,您可以产生足够长的UI线程以绘制屏幕。也许对我来说,电话回应实在是不行。

这是正确的操作顺序:
1)向您显示启动画面
2)在启动屏幕的“显示”事件中,后台工作线程和计时器触发。
3)后台工作程序检查SQL连接是否可以正常工作,但只需根据是否可以建立连接将标志设置为true或false,还可以将一个标志指示SQL检查已完成。
4)在计时器事件处理程序中,检查SQL检查是否已完成。
5)如果检查已完成,则可以隐藏启动屏幕...

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
然后将SQL检查移到“窗体的显示事件”中。注意:Shown事件,而不是Loaded事件。另外,如果距离仍然太长,请阅读启动画面。您是否考虑过启动屏幕会执行SQL检查并让它声明SQL连接不良,或者如果启动良好就适当启动程序?
 
Last edited:

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
然后将SQL检查移到“窗体的显示事件”中。注意:Shown事件,而不是Loaded事件。另外,如果距离仍然太长,请阅读启动画面。您是否考虑过启动屏幕会执行SQL检查并让它声明SQL连接不良,或者如果启动良好就适当启动程序?

感谢您添加启动屏幕的过程,该屏幕可以用作连接数据库的画布并覆盖短暂的连接延迟...。但是,当您无法连接时,它不会显示启动屏幕,直到消息弹出可以说您无法连接到数据库...

我尝试过移动代码,但是不确定为什么它没有显示启动画面。

C#:
public void Splash_Shown(object senter, EventArgs e)
{
    SqlTest(connectionstring)
}
public bool SqlTest(String connectionString)
{
    using SqlConnection connection = new SqlConnection(connectionString)
    {
        try
        {
            connection.Open();
            Form1 mf = new Form1();
            mf.Show();
            this.Hide();
            return true;
        }
        catch (SqlException)
        {
            MessageBox.Show("Could not connect");
            this.Close();
            return false;
        }
       
    }
}

我以前在Splash_shown中确实有if语句,而在SqlTest方法中有try catch……但是似乎都没有用。

为了便于参考,它看起来像这样:

C#:
public void Splash_Show(object sender, EventArgs e)
{
    if (SqlTest(connectionString))
    {
        Form1 mf = new Form1();
        mf.Show();
        this.Hide();
    }
    else
    {
        this.Close();
    }
}
public static bool SqlTest(String connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        try
        {
            connection.Open();
            return true;
        }
        catch (SqlException)
        {
            NessageBox.Show("Could not connect");
            return false;
        }
    }
}
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
好奇怪的写作:

C#:
Wait(10);

在完成测试时显示启动屏幕。...不知道为什么需要一毫秒才能工作,但显然可以。

(我的主程序中有一个wait方法,在这里调用它)。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
您的SQL连接占用了主UI线程。通过在此处放置暂停,您可以产生足够长的UI线程以绘制屏幕。也许对我来说,电话回应实在是不行。

这是正确的操作顺序:
1)向您显示启动画面
2)在启动屏幕的“显示”事件中,后台工作线程和计时器触发。
3)后台工作程序检查SQL连接是否可以正常工作,但只需根据是否可以建立连接将标志设置为true或false,还可以将一个标志指示SQL检查已完成。
4)在计时器事件处理程序中,检查SQL检查是否已完成。
5)如果检查已完成,则可以隐藏启动屏幕。
6)如果无法建立连接,则显示错误消息,然后退出。
7)其他(可以建立连接),然后显示您的主要表单。

I'm quite saddened by the current crop of Google search results showing how to show a splash screen. Although the approaches given there would work, they are actually not the correct way to do splash screen. The correct way involves swapping the Application.MainForm from the splash screen to the true main form, but it seems like that bit of lore has been lost.
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
我猜想If语句将它绑起来了,仅仅是因为它在Shown方法中……还有其他可能。这就是为什么我尝试等待。

今天早些时候,我一直在阅读有关Background Worker任务的信息,也正在观看一些有关异步的教程。

如果我说实话,还没真正沉入其中,又读又看,我可能会开始理解它。也认为我需要开始一个新项目并使用这些想法,因为试图将它们强加到我的旧项目中对我而言并不是真正的工作。我认为当我对它们有更好的了解时,我会回来看看是否能适应它们。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
WinForms应用程序是事件驱动的。是时候学习事件驱动的编程及其工作原理了。

快速而肮脏的摘要是这样的:Windows应用程序以紧密的循环运行,该循环从OS或程序本身获取消息,并将该消息发送到适当的消息处理程序。当按键被按下时,消息将发送到当前焦点所在的窗口以处理按键。然后,它将控制权返回到循环。释放一个键,将消息发送到具有当前焦点的窗口以处理当前版本。然后,它将控制权返回到循环。鼠标已移动。一样。该窗口需要重新粉刷。一样。计算机足够快,每个处理程序都足够快以执行其操作,然后将控制交还给紧密循环。当事件处理程序花费很长时间时,显然,循环不会获得下一条消息并将其发送到适当的处理程序的机会。您的SQL测试需要很长时间。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,921
地点
英国
编程经验
10+
人们应该使用WPF,而不是Winforms。时间与时俱进。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,921
地点
英国
编程经验
10+
那不是使用像Winforms这样的过时和低劣的东西的借口。

如果您希望获得使用WPF的帮助,可以在论坛上提问,如您所知,这里有很多人可以为您提供帮助。我敦促您使用WPF,并从今天开始学习。是的,它带有学习曲线,但这是值得的。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
好了,该应用程序已在Win Form中完成,因此给了我一些空闲时间来尝试将其放入WPF。

我总是觉得在寻求帮助(因为一段代码不会像您想的那样工作)与基本上要求某人为您编写代码之间有区别。

我将再次在WPF上感到裂痕,我获得了大约30%的支持并撞墙了,但仍然有很多工作要做以完成我正在开发的应用程序-因此,我将看看能否获得最后的70%完成。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,921
地点
英国
编程经验
10+
是的,我听到了。对于来自Winforms方面的任何人来说,过渡过程都相当曲折……因为WPF中的几乎所有操作都与在Winforms中的习惯有所不同,这通常是大多数学习者恢复使用Winforms的原因。但是现在您将需要在WPF中开发应用程序,这可能会花费您无数小时的重新开发时间。我说这不值得,除非您会从中获得经验。这当然是一件好事。

如果您也是一个初学者,那么花更多的时间来学习WPF来从事开发经验是值得的。

关于此:
我总是觉得在寻求帮助(因为一段代码不会像您想的那样工作)与基本上要求某人为您编写代码之间有区别。
不用担心这些论坛。假设您已展示了尝试编写自己的逻辑的尝试,无论该逻辑/源代码有多糟糕。我们只关心您在寻求帮助之前尝试编写自己的代码,因此,我们总是很乐意帮助任何人。
 
最佳 底部