Если у меня есть минимум 2 класса.Один класс создает растровое изображение, а другой рисует растровое изображение в форме пользовательского интерфейса.Я хочу спросить вас, есть ли переменная, которую я могу перенести из UIClass в GeneratorClass, кроме всей формы или любого элемента управления.Я предпочитаю переносить «Поток» как свойство из UIClass в GeneratorClass, и в GeneratorClass я могу создать изображение там, вызвав UIThread.
Я знаю:
Control.Invoke(Delegate, Parameters)
Или в WPF
Control.Dispatcher(Delegate, Parameters)
Я также знаю
System.Threading.Thread(ThreadStart)
Я предпочитаю иметь только «Thread-Variable» для работы с Invoking или использовать Dispatcher, чтобы остаться в WPF и WinForms и GeneratorClass ста же тема.
Спасибо за ваши идеи (предпочтительнее в VB.Net)
* Мой рабочий ответ *
используйте общий Threading.SynchronizationContext.Current
дляполучить текущий поток пользовательского интерфейса.Затем используйте GuiThread.Send(AddressOf MyMethode, MyParameters)
для работы в потоке пользовательского интерфейса.
Private Sub CreateTestImage()
'This methode is needed to work in Ui Thread
Dim SyncContext As Threading.SynchronizationContext = Threading.SynchronizationContext.Current 'Read current UI Thread and store it to variable
If Me._UseMultiThreading = True Then
'call methode WITH multthreading
Dim ThS As New Threading.ParameterizedThreadStart(AddressOf CreateTestImageAsync)
Dim Th As New Threading.Thread(ThS)
Th.SetApartmentState(Threading.ApartmentState.STA)
Th.Start(SyncContext)
Else
'call methode WITHOUT multthreading
Call CreateTestImageAsync(SyncContext)
End If
End Sub
Метод в потоке:
Private Sub CreateTestImageAsync(ByVal obj As Object)
'Callback is only supporting As Object.
'Cast it back the the SynchronizationContext
Dim GuiThread As Threading.SynchronizationContext = CType(obj, Threading.SynchronizationContext)
'Do some stuff
GuiThread.Send(AddressOf ImageCreated, ImgInfo) 'Call methode in UI thread
End Sub