VB. NET Многопоточный вызов с несколькими объектами пользовательского интерфейса - PullRequest
0 голосов
/ 09 июля 2020

Недавно я работал над проектом, и все было хорошо во время отладки, но после того, как я создал установку и установил проект, я получил ошибку «System.Runtime.InteropServices.ExternalException (0x80004005): GDI + ...». Я понял, что ошибка, вероятно, вызвана такими кодами, как:

My.Resources.MyImage.Save(Application.Startuppath + "/Example.png")

или / и


Sub Example()
if My.Settings.PortBusy = False Then
dim t1 as new threading.thread(addressof IsPortOpen)
t1.start
My.Settings.PortBusy = True
End If
End Sub

.
.
.

 Function operaport() As Boolean
                Dim Client As TcpClient = Nothing
                Try
                    Client = New TcpClient("127.0.0.1", 9223)
                    Return True
                Catch ex As SocketException
                    Return False
                Finally
                    If Not Client Is Nothing Then
                        Client.Close()
                    End If
                End Try
    End Function



Sub IsPortOpen()
        Dim brvpt As Boolean = brvport()
        Dim gecpt As Boolean = geckoport()
        Dim cpt As Boolean = chromeport()
        Dim opt As Boolean = operaport()
        If brvpt = True Or gecpt = True Or cpt = True Or opt = True Then
            PortStatus.Checked = True
        Else
            PortStatus.Checked = False
        End If
        My.Settings.PortBusy = False
    End Sub

Вместо них я использовал

Dim copy As Image = My.Resources.MyImage
copy.Save(Application.Startuppath + "/Example.png")

и

PortStatus.InvokeSafe(New shit(AddressOf IsPortOpen))

Но есть еще одна задача «Threading.Thread», которая взаимодействует с несколькими объектами пользовательского интерфейса. Итак, как я могу "InvokeSafe" несколько объектов, чтобы использовать многопоточные задачи, которые взаимодействуют с более чем одним объектом?

Большое спасибо за чтение :).

1 Ответ

0 голосов
/ 10 июля 2020

Этот вопрос беспорядочный, но, если я правильно понимаю суть, вам просто нужно передать делегата InvokeSafe для метода, который взаимодействует с вашими несколькими объектами пользовательского интерфейса. Я предполагаю, что InvokeSafe - это метод расширения, который проверяет свойство InvokeRequired и вызывает метод Invoke элемента управления, для которого вы его вызываете. Я должен догадаться, потому что вы не удосужились объяснить. В этом случае не имеет значения, какой элемент управления вы его вызываете. Задача этих членов - гарантировать выполнение кода в потоке, которому принадлежит указанный c элемент управления. Это будет один и тот же поток для каждой формы и элемента управления, поэтому не имеет значения, какой из ваших контролируемых элементов вы используете для доступа к этому потоку.

...