Application.Run() 和 System.Windows.Forms.Form.Show() 方法的区别
2007-01-15 21:39
585 查看
其实这个题目和内容有点不符,但是目前也就这些理解,为了不至于由于时间的关系而忘记,先写下一些不成熟的文字。以后有了新的,更加深刻的理解再将其完善。各位如果有什么简介和意见我也是非常欢迎的。
很少写WinForm的程序,这回需要自己写一个邮件发送程序,为了减少直接操作配置文件而产生错误的可能性,所以决定写一个WinForm程序。我的开发环境是vs.net 2003 + .net framework 1.1 + vb.net。
从最开始显示登录界面就有了问题,我的系统是从一个模块中启动的,代码如下:
''' -----------------------------------------------------------------------------
''' <summary>
''' 系统启动模块,做一些系统启动的准备和初始化工作;
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [fujun] 2007-1-15 Created
''' </history>
''' -----------------------------------------------------------------------------
Module InitializeModule Initialize
Public f_Login As New Login
Public Sub Main()Sub Main()
'将登录界面作为启动的初始界面;
Application.Run(f_Login)
End Sub
End Module
这里使用了Application.Run(Form)的方法来启动登录界面(f_Login)。但是我最开始的代码不是这样写的,我开始的时候使用的是f_Login.Show()方法来启动。运行的结果是登录界面在屏幕中闪现了一下就消失了,系统也运行完毕。
通过断点跟踪,发现Application.Run(Form)方法运行后,就弹出了登录界面(f_Login),以后似乎就和Application.Run(Form)这个函数好像没有关系了。然后如果你如果你完全退出了系统,Application.Run(Form)才执行完成,然后退出。反过来如果使用Form.Show()方法,那么执行Form.Show()完成后,马上就退出了Main()函数。从这里我们就可以知道为什么使用Form.Show()后,登录界面仅仅只会在屏幕中闪现一下就没有了。那是由于Main函数执行完成了,用于执行程序的线程也就销毁了,程序当然退出了。
从MSDN中查看了一下Application.Run()函数的定义--"在当前线程上开始运行标准应用程序消息循环。",不是很懂,用Reflector查看了一下Application.Run()的实现代码,如下所示:
Public Shared Sub Run()Sub Run()
ThreadContext.FromCurrent.RunMessageLoop(-1, New ApplicationContext)
End Sub
似乎是建立一个应用程序运行的上下文环境(ApplicationContext)。
还有一点是在后续编程的过程中发现的,用Application.Run(Form)启动的这个窗体, 我这个项目中就是f_Login,是不能通过销毁(Dispose)的,如果销毁了那么引用程序也就随之退出了。比如这个项目还有一个主菜单界面,是在登录成功后显示的,如果登录成功后登录界面显然是不需要再显示出来了。那么代码如下:
If (txtLoginName.Text.Trim() = String.Empty) Then
MsgBox(NOLOGINNAME)
ElseIf (txtPassword.Text.Trim() = String.Empty) Then
MsgBox(NOPASSWORD)
Else
Dim objFacade As New Facade.FacadeBase
If (objFacade.CheckIsUser(txtLoginName.Text, txtPassword.Text) = True) Then
'如果登录成功,那么显示主界面;
Dim objMainMenu As New MainMenu
objMainMenu.Show()
Me.Hide()
'Me.Dispose() '如果这里销毁了登录界面对象(f_Login)的话,那么整个系统也会随之退出。
Else
MsgBox(NOSUCHUSER)
End If
End If
这里是将登录界面(f_Login)的Visible属性设置为False(通过了Hide()方法),也就是登录界面虽然看不见但是实际上是存在于内存中的,由于它的存在,那么系统就依然正常运行而不会退出。而如果用Dispose方法将其对象销毁掉后那么系统的线程也就退出了,而不能再继续运行。
很少写WinForm的程序,这回需要自己写一个邮件发送程序,为了减少直接操作配置文件而产生错误的可能性,所以决定写一个WinForm程序。我的开发环境是vs.net 2003 + .net framework 1.1 + vb.net。
从最开始显示登录界面就有了问题,我的系统是从一个模块中启动的,代码如下:
''' -----------------------------------------------------------------------------
''' <summary>
''' 系统启动模块,做一些系统启动的准备和初始化工作;
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [fujun] 2007-1-15 Created
''' </history>
''' -----------------------------------------------------------------------------
Module InitializeModule Initialize
Public f_Login As New Login
Public Sub Main()Sub Main()
'将登录界面作为启动的初始界面;
Application.Run(f_Login)
End Sub
End Module
这里使用了Application.Run(Form)的方法来启动登录界面(f_Login)。但是我最开始的代码不是这样写的,我开始的时候使用的是f_Login.Show()方法来启动。运行的结果是登录界面在屏幕中闪现了一下就消失了,系统也运行完毕。
通过断点跟踪,发现Application.Run(Form)方法运行后,就弹出了登录界面(f_Login),以后似乎就和Application.Run(Form)这个函数好像没有关系了。然后如果你如果你完全退出了系统,Application.Run(Form)才执行完成,然后退出。反过来如果使用Form.Show()方法,那么执行Form.Show()完成后,马上就退出了Main()函数。从这里我们就可以知道为什么使用Form.Show()后,登录界面仅仅只会在屏幕中闪现一下就没有了。那是由于Main函数执行完成了,用于执行程序的线程也就销毁了,程序当然退出了。
从MSDN中查看了一下Application.Run()函数的定义--"在当前线程上开始运行标准应用程序消息循环。",不是很懂,用Reflector查看了一下Application.Run()的实现代码,如下所示:
Public Shared Sub Run()Sub Run()
ThreadContext.FromCurrent.RunMessageLoop(-1, New ApplicationContext)
End Sub
似乎是建立一个应用程序运行的上下文环境(ApplicationContext)。
还有一点是在后续编程的过程中发现的,用Application.Run(Form)启动的这个窗体, 我这个项目中就是f_Login,是不能通过销毁(Dispose)的,如果销毁了那么引用程序也就随之退出了。比如这个项目还有一个主菜单界面,是在登录成功后显示的,如果登录成功后登录界面显然是不需要再显示出来了。那么代码如下:
If (txtLoginName.Text.Trim() = String.Empty) Then
MsgBox(NOLOGINNAME)
ElseIf (txtPassword.Text.Trim() = String.Empty) Then
MsgBox(NOPASSWORD)
Else
Dim objFacade As New Facade.FacadeBase
If (objFacade.CheckIsUser(txtLoginName.Text, txtPassword.Text) = True) Then
'如果登录成功,那么显示主界面;
Dim objMainMenu As New MainMenu
objMainMenu.Show()
Me.Hide()
'Me.Dispose() '如果这里销毁了登录界面对象(f_Login)的话,那么整个系统也会随之退出。
Else
MsgBox(NOSUCHUSER)
End If
End If
这里是将登录界面(f_Login)的Visible属性设置为False(通过了Hide()方法),也就是登录界面虽然看不见但是实际上是存在于内存中的,由于它的存在,那么系统就依然正常运行而不会退出。而如果用Dispose方法将其对象销毁掉后那么系统的线程也就退出了,而不能再继续运行。
相关文章推荐
- C# Show() 与 ShowDialog() Form.Show()与application.run()区别
- Application.Run()和Form.Show()的区别
- C# Show() 与 ShowDialog() Form.Show()与application.run()区别
- 【C#遗补】获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPath的区别
- 【C#遗补】获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPath的区别
- System.IO.Directory.GetCurrentDirectory与System.Windows.Forms.Application.StartupPath用法浅谈
- System.IO.Directory.GetCurrentDirectory与System.Windows.Forms.Application.StartupPath的用法
- System.Windows.Forms.Timer与System.Timers.Timer的区别
- System.Windows.Forms.Application.DoEvents()
- System.Windows.Forms.Timer和System.Timers.Timer的区别 [转]
- System.Windows.Forms.Timer和System.Timers.Timer的区别
- 窗体类Form中方法Show()和ShowDialog()的区别
- System.Windows.Forms.Timer与System.Timers.Timer的区别
- System.Windows.Forms.Timer和System.Timers.Timer的区别 [转]
- 使用System.Windows.Forms.Application.DoEvents实时更新画面
- “FormCRUD.csProj.FormMain.Name”隐藏了继承的成员“System.Windows.Forms.Control.Name”。如果是有意隐藏,请使用关键字 new。
- System.Windows.Forms.Timer与System.Timers.Timer的区别
- System.Windows.Forms.Timer和System.Timers.Timer的区别 [转]
- 看System.Windows.Forms.Form.ActiveForm
- System.Windows.Forms.Application.ExecutablePath 路径问题