Как получить тему для вызова в DotNet - PullRequest
1 голос
/ 31 мая 2011

Если у меня есть минимум 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

1 Ответ

2 голосов
/ 31 мая 2011

Вы бы передали текущий SynchronizationContext в поток. в вашей ветке это будет выглядеть примерно так:

void ThreadMethod(object parameter)
{
    var context = (SynchronizationContext)parameter;

    context.Send((s) => TheMethodYouWantToRunOnTheUiThread(), null);
}

Вы бы начали свою тему следующим образом:

var newThread = new Thread(ThreadMethod);
newThread.Start(SynchronizationContext.Current);

Это в C #, но я думаю, что вы можете перевести это.

Кстати: это тот же механизм, который используется BackgroundWorker классом для перенаправления событий ProgressChanged и Completed в поток пользовательского интерфейса. См. здесь для получения дополнительной информации по этой теме

...