Я пытаюсь поднять событие из фоновой задачи библиотеки классов UWP, но мне нужно его маршалировать на главном UI-поток в приложении UWP. Я планирую использовать библиотеку классов. Однако я ищу способ маршалировать его из фоновой задачи. Я просмотрел несколько статей, включая этот: Raise Events in .NET on the main UI thread , но это не имеет смысла для меня. Может ли кто-нибудь помочь мне с приведенным ниже кодом?Как я могу поднять событие в главном потоке пользовательского интерфейса из фоновой задачи в UWP APP (vb.net)
Private ReceiveTask As New Task(Sub()
Dim InStream As Stream = CSocket.InputStream.AsStreamForRead
While killswitch = False
Try
Dim Reader As StreamReader = New StreamReader(InStream)
Dim DataText As String = ""
While Reader.Peek <> -1
DataText &= Convert.ToChar(Reader.Read)
End While
RaiseEvent DataReceived(DataText)
Catch ex As Exception
RaiseEvent SocketError("Receiving", ex.Message)
End Try
End While
End Sub)
Благодаря jmcilhinney, код работает!
Private ReceiveTask As New Task(Sub()
Dim InStream As Stream = CSocket.InputStream.AsStreamForRead
While killswitch = False
Try
Dim Reader As StreamReader = New StreamReader(InStream)
If Reader.Peek <> -1 Then
DataText = ""
While Reader.Peek <> -1
DataText &= Convert.ToChar(Reader.Read)
End While
uiContext.Post(AddressOf RaiseDataToUI, Nothing)
End If
Catch ex As Exception
ReceiveError = ex.Message
uiContext.Post(AddressOf RaiseErrorToUI, Nothing)
End Try
End While
End Sub)
Это работает в том смысле, что теперь я могу поднять событие в пользовательский интерфейс. Но я тестировал свой тестовый клиент с программным обеспечением тестового сервера, и похоже, что uiContext.post не может отправить информацию в пользовательский интерфейс достаточно быстро. Я пропускаю кучу информации, поступающей через сокет. Task.Delay, похоже, совсем не помогает. Есть идеи? – Kevin
Nevermind, он работает. Очищал буфер до того, как событие успело стрелять. Будет опубликован правильный код для других. – Kevin
В моем примере выше, я передал 'Nothing' во второй параметр метода' Post'. Я вижу, что вы сделали то же самое в своем последнем коде, что говорит о том, что вы должны читать данные в методе 'RaiseErrorToUI'. Возможно, вам лучше прочитать эти данные перед вызовом 'Post' и передать его этому параметру. Затем вы получите его в качестве аргумента в верхней части метода, который вы вызываете. Это означает, что не имеет значения, что происходит с исходным источником данных за это время. – jmcilhinney