ConnectionTimeout一定要30秒这么久吗?使用多线程连结数据库并显示连接动画

ConnectionTimeout一定要30秒这么久吗?使用多线程连结数据库并显示连接动画

最近一直在忙于EasyCode.Net代码生成器2.20的升级版的开发工作,前两天又有朋友问我EasyCode连结数据库服务器时,为什么可以5秒内就返回该数据库是否可以连结的信息,而不是像自己写的程序会“假死”一样等待30秒,其实原理很简单:

ConnectionTimeout一定要30秒这么久吗?使用多线程连结数据库并显示连接动画_第1张图片

1.SqlConnection在用户名或密码错时,返回错误信息会很快,但如果主机名或IP地址错误,因为网络访问的原因,所以即使设置了ConnectionTimeout也没有效果。

2.如果Connection在访问一个不存在的服务器,进度将一直等待Connection.Open()方法的结果,对于WinForm将会产生界面假死。

 

所以解决方法也非常简单:

1.添加一个动画窗口,显示连结数据库动画,并加上FormClosing事件处理方法,使其不能够用ALT+F4关闭。

2.另外开起一个线程连结数据库,并判断该线程执行时间,如果超过我们指定的时间(比如5秒),就认为无法连结数据库。

3.通常正常连结数据库会非常快,为了避免动画窗口一闪而过,可以设定个动画窗口显示的最短时间(比如0.5秒)。

 

我用EasyCode做了一个示例,相关界面、代码、及程序如下:

ConnectionTimeout一定要30秒这么久吗?使用多线程连结数据库并显示连接动画_第2张图片

 

下面这个是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 ;
     }
}

 所有源代码打包下载:http://files.cnblogs.com/BudEasyCode/ConnDB.rar

代码很简单,大家看一下应该都会明白,其实也可以用于连结网络,复杂耗时计算等应用场景。关于我所设计的EasyCode.Net代码生成器的2.20升级版本,我们也正在努力的开发和测试过程中,您可以通过我的博客查看该代码生成器详细信息,或从我们的官方网站:http://www.budeasycode.com来查看。

 

标签: 代码生成
7
0
(请您对文章做出评价)

« 博主前一篇:我们的创业——打造中国最好的.Net代码生成器
» 博主后一篇:【笔记】老程序员从头开始学JQuery的读书笔记

你可能感兴趣的:(代码生成)