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