Bob Janelli Ответов: 1

Как обновить список форм из потока? Я использую это для получения записей системного журнала.


Я хотел бы обновить элемент управления listbox в моей форме из созданного мной потока.

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

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

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

Что я уже пробовал:

Imports System.IO
Imports System.Net.Sockets
Imports System.Net
Imports System.Text
Imports System.Net.Http
Imports System.Threading


Public Class Form1

    Shared WithEvents mysyslog As syslog = New syslog()

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ListBox1.Items.Add("Syslog")

        Dim t As Thread
        t = New Thread(AddressOf mysyslog.Getline)
        t.Start()

    End Sub



    Shared Sub SyslogEvent(ByVal sdatareceived As String) Handles mysyslog.ThreadComplete

        Console.WriteLine(sdatareceived)


        'ListBox1.Items.Add(sdatareceived)  'When I add this line I get  ...cannnot refer to an instance member of a class from within a shared method or shared member initializer


        MsgBox("done")

    End Sub

End Class


Public Class syslog

    Dim ipeRemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)
    Dim udpcUDPClient As New UdpClient(514)
    Public sDataRecieve As String
    Dim bBytesRecieved() As Byte
    Dim sFromIP As String

    Public Event ThreadComplete(ByVal sDataRecieve As String)

    Public Sub Getline()
        bBytesRecieved = udpcUDPClient.Receive(ipeRemoteIpEndPoint)
        sDataRecieve = Encoding.ASCII.GetString(bBytesRecieved)
        sFromIP = ipeRemoteIpEndPoint.Address.ToString
        RaiseEvent ThreadComplete(sFromIP & sDataRecieve)
    End Sub

End Class

1 Ответов

Рейтинг:
0

OriginalGriff

Здесь есть две проблемы, с одной из которых вы еще не встречались, потому что другая предотвращает ее возникновение.
Проблема, с которой вы столкнулись, проста: вы не можете получить доступ к полям, свойствам, методам или событиям экземпляра класса В общем методе, потому что он (по определению) не имеет связанного с ним экземпляра.
Вот что говорит Ошибка: общий метод не имеет никакого интерфейса для работы.
Вы можете обойти это, удалив общий атрибут из метода.

Проблема, которую он "скрывает", заключается в том, что вы не можете получить доступ к элементам управления пользовательского интерфейса из потока, отличного от потока пользовательского интерфейса, в котором он был создан, и если вы попытаетесь это сделать, то получите ошибку во время выполнения:"исключение перекрестного потока".
Чтобы вылечить это, вы будете вызывать элемент управления, чтобы переместить обновление обратно в поток пользовательского интерфейса: Контроль.Вызов Метода (Делегата) (System.Окна.Формы)[^]