2017-01-29 2 views
0

Я пытаюсь поднять событие из фоновой задачи библиотеки классов 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) 

ответ

0

Я не сделал каких-либо UWP Development себя, но я считаю, что правильный способ сделать, как вы хотите использовать SynchronizationContext класс, как в WPF. Принцип заключается в том, что свойство SynchronizationContext.Current даст экземпляр класса, специфичный для потока, поэтому вы можете получить значение этого свойства в потоке пользовательского интерфейса, а затем использовать этот объект в другом месте, чтобы маршировать вызов в потоке владения. Значение свойства обычно извлекается в конструкторе объекта, который сам создается в потоке пользовательского интерфейса, например.

Imports System.Threading 

Public Class SomeClass 

    'Get the context for the thread on which the current instance is created. 
    Private uiContext As SynchronizationContext = SynchronizationContext.Current 

    Private Sub ThisMethodIsCalledOnASecondaryThread() 
     uiContext.Post(AddressOf ThisMethodIsCalledOnTheUIThread, Nothing) 
    End Sub 

    Private Sub ThisMethodIsCalledOnTheUIThread(data As Object) 
     'Execute UI thread logic here, e.g. raise an event. 
    End Sub 

End Class 
+0

Это работает в том смысле, что теперь я могу поднять событие в пользовательский интерфейс. Но я тестировал свой тестовый клиент с программным обеспечением тестового сервера, и похоже, что uiContext.post не может отправить информацию в пользовательский интерфейс достаточно быстро. Я пропускаю кучу информации, поступающей через сокет. Task.Delay, похоже, совсем не помогает. Есть идеи? – Kevin

+0

Nevermind, он работает. Очищал буфер до того, как событие успело стрелять. Будет опубликован правильный код для других. – Kevin

+0

В моем примере выше, я передал 'Nothing' во второй параметр метода' Post'. Я вижу, что вы сделали то же самое в своем последнем коде, что говорит о том, что вы должны читать данные в методе 'RaiseErrorToUI'. Возможно, вам лучше прочитать эти данные перед вызовом 'Post' и передать его этому параметру. Затем вы получите его в качестве аргумента в верхней части метода, который вы вызываете. Это означает, что не имеет значения, что происходит с исходным источником данных за это время. – jmcilhinney

Смежные вопросы