Egyébként a fő szálban lévő controlokat is lehet szerkeszteni, de nem úgy hogy textbox.text, hanem delegate utasítással.
Jó régi kód, már nem is nagyon emlékszem rá, ezzel tudsz játszani, igaz ez vb, de át lehet fordítani c#-ra.
Public Class SplashForm
#Region "DECLARE"
Implements IDisposable
Private _ParentForm As Form
Private t As Threading.Thread = Nothing
Private f As FP_SplashForm = Nothing
Private _Sleep As Integer
Private Delegate Sub SetMessageTextDelegate(MessageText As String)
#End Region
#Region "CLASS CONSTRUCTOR"
Public Sub New(ParentForm As Form)
_ParentForm = ParentForm
End Sub
Public Sub New(ParentForm As Form, MessageText As String, Optional Sleep As Integer = 1000)
_ParentForm = ParentForm
OpenSplashForm()
SetMessageText(MessageText, Sleep)
End Sub
#End Region
#Region "IDISPOSABLE SUPPORT"
Private disposedValue As Boolean
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: dispose managed state (managed objects).
End If
End If
Me.disposedValue = True
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
#Region "PRIVATE SUBS"
Private Sub _Close()
If f Is Nothing Then
Exit Sub
End If
f.Close()
f = Nothing
End Sub
Private Sub _ShowForm()
f = New FP_SplashForm
'f.TopMost = True
f.ShowDialog()
End Sub
#End Region
#Region "PUBLIC SUBS"
Public Sub CloseSplashForm()
If f Is Nothing Then
Exit Sub
End If
f.Invoke(New MethodInvoker(AddressOf _Close))
If t Is Nothing Then
Exit Sub
End If
t.Join()
End Sub
Public Sub SetMessageText(MessageText As String, Optional Sleep As Integer = 0)
System.Threading.Thread.Sleep(200) 'Azert kell ide, mert kulonben az InvokeRequired utasitas hibat general
If f.InvokeRequired Then
f.Invoke(New SetMessageTextDelegate(AddressOf SetMessageText), MessageText)
If Sleep > 0 Then
System.Threading.Thread.Sleep(Sleep)
End If
Else
f.MessageText_Label.Text = MessageText
End If
End Sub
Public Sub OpenSplashForm()
t = New Threading.Thread(AddressOf _ShowForm)
t.SetApartmentState(Threading.ApartmentState.STA)
t.Priority = Threading.ThreadPriority.Highest
t.Name = "SplashFormThread"
t.Start()
End Sub
#End Region
End Class