Используете ли вы WPF или Winforms?В любом случае, если вы хотите что-то сделать с пользовательским интерфейсом, вам придется вернуться в поток пользовательского интерфейса.
Для этого в WPF вы можете использовать объект диспетчера и вызывать его, чтобы метод выполнялся потоком пользовательского интерфейса, а не вашим рабочим потоком.В Winforms вам придется поддерживать ссылку на некоторый элемент управления пользовательского интерфейса и вызывать этот элемент управления.
Рассмотрим следующий фрагмент кода (WPF):
if (!myCheckBox.Dispatcher.CheckAccess())
{
myCheckBox.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
myCheckBox.IsChecked = true;
}
));
}
else
{
myCheckBox.IsChecked = true;
}
Вот еще один фрагмент кода, который я использую в Winforms, чтобы поднять мои события из потока пользовательского интерфейса
Friend Shared Sub RaiseUiEvent(ByVal hnd As EventHandler, ByVal sender As Object, ByVal e As EventArgs)
Dim uiRef = GlobalManager.GetInstance().UI
Try
uiRef.BeginInvoke(hnd, sender, e)
Catch ex As InvalidOperationException
''if UiRef is null, then we simply drop the event
Logger.AddTextToLog(ex)
Debug.WriteLine("Invalid operation in raiseUiEvent")
Catch ex As NullReferenceException
Logger.AddTextToLog(ex)
Debug.WriteLine("Null Reference in RaiseUiEvents")
End Try
End Sub