ConnectionTimeout一定要30秒这么久吗?使用多线程连结数据库并显示连接动画
最近一直在忙于EasyCode.Net代码生成器2.20的升级版的开发工作,前两天又有朋友问我EasyCode连结数据库服务器时,为什么可以5秒内就返回该数据库是否可以连结的信息,而不是像自己写的程序会“假死”一样等待30秒,其实原理很简单:
1.SqlConnection在用户名或密码错时,返回错误信息会很快,但如果主机名或IP地址错误,因为网络访问的原因,所以即使设置了ConnectionTimeout也没有效果。
2.如果Connection在访问一个不存在的服务器,进度将一直等待Connection.Open()方法的结果,对于WinForm将会产生界面假死。
所以解决方法也非常简单:
1.添加一个动画窗口,显示连结数据库动画,并加上FormClosing事件处理方法,使其不能够用ALT+F4关闭。
2.另外开起一个线程连结数据库,并判断该线程执行时间,如果超过我们指定的时间(比如5秒),就认为无法连结数据库。
3.通常正常连结数据库会非常快,为了避免动画窗口一闪而过,可以设定个动画窗口显示的最短时间(比如0.5秒)。
我用EasyCode做了一个示例,相关界面、代码、及程序如下:
下面这个是Connection窗口,其中左侧的图标是个GIF动画图片:
其中多线程连结数据库代码,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | private string ConnnectionString; private bool ConnSuccess; private void BtnTestConn_Click( object sender, EventArgs e) { ConnnectionString = TxtConnStr.Text; ConnSuccess = false ; TestConnection(500, 3000); //多线程连结数据库,最少显示动画窗口500毫秒,超时时间3000毫秒 } public void TestConnection( int minTimes, int maxTimes) { FormConnServer formConnServer = new FormConnServer(); formConnServer.Show(); formConnServer.CanClose = false ; Thread makeConnectionThread = new Thread(TestSqlServerConn); makeConnectionThread.IsBackground = true ; makeConnectionThread.Priority = ThreadPriority.Highest; makeConnectionThread.Start(); int sleepTimes = 0; while (!ConnSuccess || sleepTimes < minTimes) { Application.DoEvents(); Thread.Sleep(50); sleepTimes += 50; if (sleepTimes > maxTimes) { makeConnectionThread.Abort(); if (!ConnSuccess) MessageBox.Show( "无法与数据库服务器建立连结,请确认配置信息是否正确。" , "系统提示" , MessageBoxButtons.OK, MessageBoxIcon.Information); formConnServer.CanClose = true ; formConnServer.Close(); return ; } } formConnServer.CanClose = true ; formConnServer.Close(); MessageBox.Show( "与数据库服务器建立连结成功。" .PadRight(50, ' ' ), "系统提示" , MessageBoxButtons.OK, MessageBoxIcon.Information); return ; } private void TestSqlServerConn() { SqlConnection sqlConnection = new SqlConnection(); try { sqlConnection.ConnectionString = ConnnectionString; sqlConnection.Open(); sqlConnection.Close(); ConnSuccess = true ; } catch { sqlConnection.Close(); ConnSuccess = false ; } } |
防止动画窗口被ALT+F4关闭代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public partial class FormConnServer : Form { public bool CanClose = true ; public FormConnServer() { InitializeComponent(); FormClosing += new FormClosingEventHandler(FormConnServer_FormClosing); } private void FormConnServer_FormClosing( object sender, FormClosingEventArgs e) { if (!CanClose) e.Cancel = true ; } } |
所有源代码打包下载:https://files.cnblogs.com/BudEasyCode/ConnDB.rar
代码很简单,大家看一下应该都会明白,其实也可以用于连结网络,复杂耗时计算等应用场景。关于我所设计的EasyCode.Net代码生成器的2.20升级版本,我们也正在努力的开发和测试过程中,您可以通过我的博客查看该代码生成器详细信息,或从我们的官方网站:http://www.budeasycode.com来查看。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现