C# 从Task.Whalll收集输出到列表/数据类型

C# 从Task.Whalll收集输出到列表/数据类型,c#,websocket,C#,Websocket,我用下面的c代码发送一系列请求和响应 public static async Task AuthenticateQvpx2() { var handshake = new Handshake(); foreach (var request in handshake.AutheticateStrings) { var buffer = _encoder.GetBytes(request); await Task.WhenAll(Receive

我用下面的c代码发送一系列请求和响应

public static async Task AuthenticateQvpx2()
{
    var handshake = new Handshake();
    foreach (var request in handshake.AutheticateStrings)
    {
        var buffer = _encoder.GetBytes(request);
        await Task.WhenAll(Receive(_webSocket), Send(_webSocket, buffer));
    }
}
异步函数Send和Receive的代码如下

await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);

var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
我希望将请求和响应收集到一个数组/任何形式的数据类型中


我遇到了麻烦,因为我不太确定下一步该做什么?

根据您的代码片段,我不确定发送和接收返回的任务类型,但通常在使用任务后,您可以从多个任务中获得结果。使用LINQ时,所有方法如下:

var握手=新握手; 列表任务=新建列表; 握手中的foreach var请求。AuthenticateStrings { var buffer=_encoder.GetBytesrequest; tasks.AddwebSocket.ReceiveAsyncnew ArraySegmentbuffer,CancellationToken.None; } 等待任务; var resultArray=tasks.Selectt=>t.Result.ToArray; 试试像这样的东西

ConcurrentDictionary x=新的ConcurrentDictionary; 在foreach中生成GUID并将其传递给方法:

握手中的foreach var请求。AuthenticateStrings { var buffer=_encoder.GetBytesrequest; var guid=guid.NewGuid; wait Task.WhenAllReceive_webSocket,guid,Send_webSocket,buffer,guid; } 然后,您可以自然地从接收和发送方法中使用字典

void Send(WebSocket webSocket, byte[] buffer, Guid guid)
{
  x.GetOrAdd(guid, new ValueTuple<System.Byte[], WebSocketReceiveResult>(buffer, null));
  await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None)
}

void Receive(WebSocket webSocket, Guid guid)
{
  var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
  x[guid].Item2 = result;
}
我希望收集请求和回复

收集请求有点奇怪,因为数据已经在缓冲区变量中了

假设您的意思是只需要响应,您可以使用wait:


你所说的请求到底是什么意思?你可以在你的方法中引入一些你应该使用的私有并发类型;var响应=等待接收任务@马格纳斯:在这种情况下,是的,那会起作用。在某些情况下,您确实希望在执行操作写入之前,侦听器已被连接,以避免竞争条件。但是在这种情况下,web套接字有一个缓冲区,因此响应不会丢失。
public static async Task AuthenticateQvpx2()
{
  var handshake = new Handshake();
  foreach (var request in handshake.AutheticateStrings)
  {
    var buffer = _encoder.GetBytes(request);
    var receiveTask = Receive(_webSocket);
    await Task.WhenAll(receiveTask, Send(_webSocket, buffer));
    var response = await receiveTask;
  }
}