.NET 4.0 では、読み込み時間が長い (約 20 秒) アプリを扱っているため、読み込み中にアプリケーションの上に来るフォームにスウィッシュ スクロール マーキーを表示したいと考えていました。
メインの 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# の回答コードも問題ありません (熱狂的なリガーのために)
アップデート:
質問でもっと多くの詳細を提供する必要があったことに気づきました...待機フォームは、実際にはアプリを表示する最初のフォームではありません。まずはログイン画面です。ユーザーが認証されると、ログイン フォームはアプリのメイン インターフェイスを起動しますが、これは実際には読み込みに時間がかかるフォームです。
ログイン フォームとメイン インターフェイスの間に待機フォームを表示しています。また、このフォームを使用して、ユーザーがメイン インターフェイスで起動した実行時間の長いタスクをカバーします。