Многопоточность VB.NET. Вызов вызова элемента управления пользовательского интерфейса из класса в отдельном файле класса

Я уже несколько дней пытаюсь понять это и задаюсь вопросом, не хватает ли я чего-то простого или делаю совершенно неправильно.

Пример: Два файла - TestClass.vb, myForm.vb


TestClass.vb выглядит следующим образом:

Imports System.Threading

Public Class TestClass
    Private myClassThread As New Thread(AddressOf StartMyClassThread)

    Public Sub Start()
        myClassThread.Start()
    End Sub

    Private Sub StartMyClassThread()
        myForm.Msg("Testing Message")
    End Sub
End Class

myForm.vb - это базовая форма с элементом управления списком и элементом управления-кнопкой, названные соответственно Output и StartButton. Код формы выглядит следующим образом:

Public Class myForm
    Private classEntity As New TestClass

    Private Sub StartButton_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                              Handles StartButton.Click
        Msg("Start Button Pressed")
        classEntity.Start()
    End Sub

    Delegate Sub MsgCallBack(ByVal mesg As String)

    Public Sub Msg(ByVal mesg As String)
        If Output.InvokeRequired Then
            MsgBox("Invoked")
            Dim d As New MsgCallBack(AddressOf Msg)
            Invoke(d, New Object() {mesg})
        Else
            MsgBox("Not Invoked")
            mesg.Trim()
            Output.Items.Add(mesg)
        End If
    End Sub
End Class

Результат:

Приложение запускается, без ошибок или исключений. Отображается список и кнопка «Пуск». Я нажимаю кнопку «Пуск», и в окне сообщений появляется сообщение «Не запущено», как и ожидалось, и после нажатия кнопки «ОК» в это окно сообщения «Кнопка запуска нажата» добавляется в элемент управления списком вывода. Сразу после этого снова появляется msgbox с надписью «Not Invoked». Я ожидал, что "Invoked", поскольку отдельный поток пытается использовать элемент управления списком вывода. Конечно, это приводит к попытке выполнения Output.Items.Add, которая не приводит к видимому результату, поскольку потоку не разрешено напрямую обновлять элемент управления пользовательского интерфейса.

Я, должно быть, прочитал небольшую книгу с разными страницами, пытаясь тщательно изучить понимаю ямы и методы, но я чувствую, что, возможно, попал в ловушку, которую могут сделать многие люди. Файл csv изначально был файлом Excel, который я сохранил в формате .csv

  • файл содержит три столбца данных
  • каждый столбец данных имеет разную длину, то есть в каждом столбце разное количество значений
  • Я хочу сравнить средние значения (с использованием t-критерия или эквивалента в зависимости от нормального / ненормального распределения) двух столбцов за раз, поэтому, например, t-тест между значениями столбца 1 и значениями столбца 2, затем t -тест значений столбца 1 и столбца 3 и т. д.
  • Мы будем очень благодарны за любую помощь или предложения!

    106
    задан smci 22 May 2018 в 13:36
    поделиться