在.NET 4.0中,我处理的是有一个加载时间较长(约20秒)的应用程序,所以我想显示在沙沙声的滚动字幕一个在应用程序加载时显示的表单。运行在一个单独的线程在等待主UI线程形式来完成
由于主UI线程是做数据的UI元素的所有负载,我无法得到这在一个单独的线程中执行,所以我最终尝试运行在一个新线程的形式。我结束了在窗体本身坚持这个代码,有它自身显示上一个新的线程,就像这样:
Public Class frmWait
Public Property Message As String
Get
Return Me.lblMessage.Text
End Get
Set(value As String)
If Not String.IsNullOrEmpty(value) Then
Me.lblMessage.Text = value
Else
Me.lblMessage.Text = DefaultMessage
End If
End Set
End Property
Private OwnerThread As Thread
Private OwnerForm As Form
Private Const DefaultMessage As String = "しばらくお待ちください..."
Public Sub New(ByVal ParentForm As Form)
InitializeComponent()
Me.Message = DefaultMessage
Me.OwnerForm = ParentForm
End Sub
Public Sub New(ByVal Message As String, ByVal ParentForm As Form)
Call InitializeComponent()
Me.Message = Message
Me.OwnerForm = ParentForm
End Sub
Public Sub ShowOnThread()
' Position the form in the center of the owner
With Me.OwnerForm
Dim ownerCenter As New Point(.Location.X + CInt(.Width/2), .Location.Y + CInt(.Height/2))
Me.Location = New Point(ownerCenter.X - CInt(Me.Width/2), ownerCenter.Y - CInt(Me.Height/2))
End With
Me.OwnerThread = New Thread(New ThreadStart(AddressOf Me.ShowDialog))
Call Me.OwnerThread.Start()
End Sub
Public Shadows Sub Close()
If Me.OwnerThread IsNot Nothing AndAlso Me.OwnerThread.IsAlive Then
Call Me.OwnerThread.Abort()
Else
Call MyBase.Close()
End If
End Sub
End Class
这可能是相当笨拙,但我显示在应用程序不同的地方它,所以这似乎是最具代码效率的方式...
它实际上工作得很好,但我不时遇到问题,并需要一些帮助解决这些问题。
有时,当窗体关闭时,我得到一个关于以不安全方式中止线程的错误。
此刻,我在我希望它覆盖的形式形式的中心手动定位的形式。理想情况下,我想能够调用
.ShowDialog(ParentForm)
就可以了,当然这引发由于从一种形式到其他跨线程访问异常。
关于如何解决这个问题的任何建议将不胜感激。 因为我几乎不知道什么线程,所以我可能把它编写成猴子,所以如果有更好的方法来完成这个工作,我会非常想知道它。
的代码我名单是在VB.NET,但在C#的答案代码是罚款太(任何过激retaggers)
UPDATE:
我现在意识到,我应该给很多详细资料在我的问题...等待形式实际上不是我显示应用程序的第一种形式。首先是登录屏幕。当用户通过身份验证时,登录表单将启动应用程序的主界面,这是实际需要很长时间才能加载的表单。
我的登录表单,并在主界面显示之间的等待形式。我还使用这种形式来覆盖用户在主界面上启动的任何长时间运行的任务。
使用的ShowDialog作为线程methid是前途未卜。最好写自己的。 Abort()是危险的和不必要的。 – 2013-03-22 09:03:45
@HenkHolterman谢谢,但你会建议,而不是这些?对于'ShowDialog'我成像'Application.Run()'? – 2013-03-22 09:10:31