UWPクラスライブラリのバックグラウンドタスクからイベントを発生させようとしていますが、メインでマーシャリングする必要がありますUWPアプリのUIスレッド私はクラスライブラリを使用する予定です。私はバックグラウンドタスクからマーシャリングする方法を探しています。私はこの1つを含むいくつかの記事を見てきました: Raise Events in .NET on the main UI thread しかし、それは意味がありません。誰も私の下のコードを助けることができますか?UWP APP(vb.net)のバックグラウンドタスクからメインUIスレッドのイベントを発生させる方法
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)
これは、イベントをUIに呼び出すことができるという意味で機能します。しかし、私はテストサーバーソフトウェアでテストクライアントをテストしました.UiContext.postがUIに十分速く情報を送信できないようです。私はソケットを介して来る情報の束を見逃しています。 Task.Delayはまったく役に立たないようです。何か案は? – Kevin
これは問題ありません。イベントが発生する前にバッファをクリアしていました。他の人のための正しいコードを投稿します。 – Kevin
上記の例では、 'Post'メソッドの第2引数に' Nothing'を渡しました。最終的なコードで同じことを行ったことがわかります。これは、RaiseErrorToUIメソッドでデータを読み込む必要があることを示しています。 'Post'を呼び出す前にそのデータを読み、それをそのパラメータに渡す方が良いでしょう。次に、呼び出すメソッドの先頭に引数として受け取ります。これは、その間にそのデータの元のソースに何が起こっても問題ではないことを意味します。 – jmcilhinney