在C#中,如何通过并行任务中的tcp套接字接收数据?

在C#中,如何通过并行任务中的tcp套接字接收数据?,c#,uwp,tcpclient,C#,Uwp,Tcpclient,我正在UWP应用程序中编写一个客户端程序,它通过TCP套接字从服务器接收数据,服务器定期向该客户端发送数据。 我遇到了一个问题,希望通过下面这样的任务接收数据,该任务使用LoadAsync方法读取循环中的数据。因此,我需要使用wait-before方法和async来完成此任务。当我创建StreamSocket时 并在另一个方法中调用该任务,ListenTcpClient任务在LoadAsync()方法之后返回,并且在接下来的步骤中不会接收和显示数据。您能告诉我如何在保持UI线程和其他线程处理其他

我正在UWP应用程序中编写一个客户端程序,它通过TCP套接字从服务器接收数据,服务器定期向该客户端发送数据。 我遇到了一个问题,希望通过下面这样的任务接收数据,该任务使用LoadAsync方法读取循环中的数据。因此,我需要使用wait-before方法和async来完成此任务。当我创建StreamSocket时 并在另一个方法中调用该任务,ListenTcpClient任务在LoadAsync()方法之后返回,并且在接下来的步骤中不会接收和显示数据。您能告诉我如何在保持UI线程和其他线程处理其他事情的同时从TCP套接字接收数据吗? 多谢各位

public async Task ListenTcpClient(StreamSocket clientTcpSocket)
{
    while(clientTcpSocket!=null)
    {
        using (DataReader reader = new DataReader(clientTcpSocket.InputStream))
        {
            await reader.LoadAsync(sizeof(int));
            int fdToReadRcv = reader.ReadInt32();
            byte[] bs = BitConverter.GetBytes(fdToReadRcv);
            Array.Reverse(bs);
            int fdToRead = BitConverter.ToInt32(bs, 0);
            Debug.WriteLine(fdToRead);
            StartButton1.Content = fdToRead;
        }
    }
}

private async void Button_Click(object sender, RoutedEventArgs e)
{
    clientTcpSocket = new StreamSocket();
    try
    {// create the socket
        await clientTcpSocket.ConnectAsync(new HostName(ip), tcpPort);
        using (DataReader reader = new DataReader(clientTcpSocket.InputStream))
        {
            await reader.LoadAsync(sizeof(int));
            int fdToReadRcv = reader.ReadInt32();
            byte[] bs = BitConverter.GetBytes(fdToReadRcv);
            Array.Reverse(bs);
            int fdToRead = BitConverter.ToInt32(bs,0);
            Debug.WriteLine(fdToRead);
        }
        using (DataWriter writer = new DataWriter(clientTcpSocket.OutputStream))
        {
            writer.WriteString(String.Format("Client Start"));
            await writer.StoreAsync();
        }
        timer.Start();
        ListenTcpClient(clientTcpSocket);
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
    //then do something else while the client socket is receiving data
}

只要
任务
彼此独立,就可以使用
任务并行运行它。whalll(…)


谢谢,但是如果我想继续通过tcp客户端套接字接收数据,直到服务器与UI线程和其他调用函数并行完成数据传输(可能持续3分钟,每隔一段时间发送消息),我应该怎么做?与UI线程并行?你的意思是想在UI线程中接收数据吗?不,我只想在接收数据的同时保持UI线程的运行和响应。在matramos给出的上述答案中,我认为程序将保持按钮单击方式,直到收到数据。这是真的吗?
private async void Button_Click(object sender, RoutedEventArgs e)
{
        // generate a create socket task
        var createSocketTask = CreateSocket();

        // create 'do something else' task
        var doSomethingElseTask = DoSomethingElse();

        // run both tasks in parallel
        await Task.WhenAll(createSocketTask, doSomethingElseTask);
}

private async Task CreateSocket()
{
    clientTcpSocket = new StreamSocket();
    try
    {// create the socket
        await clientTcpSocket.ConnectAsync(new HostName(ip), tcpPort);
        using (DataReader reader = new DataReader(clientTcpSocket.InputStream))
        {
            await reader.LoadAsync(sizeof(int));
            int fdToReadRcv = reader.ReadInt32();
            byte[] bs = BitConverter.GetBytes(fdToReadRcv);
            Array.Reverse(bs);
            int fdToRead = BitConverter.ToInt32(bs,0);
            Debug.WriteLine(fdToRead);
        }
        using (DataWriter writer = new DataWriter(clientTcpSocket.OutputStream))
        {
            writer.WriteString(String.Format("Client Start"));
            await writer.StoreAsync();
        }
        timer.Start();
        ListenTcpClient(clientTcpSocket);
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
}

 private async Task DoSomethingElse()
 {
        // do something
 }