собрать вывод из Task.Whenall в список / тип данных - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть следующий код 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);

Iхотите собрать запросы и ответы в массив / любую форму типа данных.

У меня возникли проблемы, так как я не совсем уверен, что мне делать дальше?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Попробуйте что-то вроде

ConcurrentDictionary<Guid, (System.Byte[], WebSocketReceiveResult)> x = new ConcurrentDictionary<Guid, (byte[], WebSocketReceiveResult)>();

Создайте GUID в вашем foreach и передайте его вашим методам:

foreach (var request in handshake.AutheticateStrings)
{
  var buffer = _encoder.GetBytes(request);
  var guid = Guid.NewGuid();
  await Task.WhenAll(Receive(_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;
}
0 голосов
/ 26 февраля 2019

Я хочу собрать запросы и ответы

Странно собирать запросы , так как эти данные уже есть (в buffer переменная).

Предполагая, что вы имели в виду, что вам просто нужен ответ , вы можете сделать это, используя await:

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;
  }
}
0 голосов
/ 26 февраля 2019

Не уверен, основываясь на ваших фрагментах, какие типы заданий возвращают ваши Send и Receive, но обычно вы можете получить результаты от нескольких задач после использования Task.WhenAll с помощью LINQ следующим образом:


var handshake = new Handshake();

List<Task<WebsocketReceiveResult>> tasks = newList<Task<WebsocketReceiveResult>>();

foreach (var request in handshake.AutheticateStrings)
{
    var buffer = _encoder.GetBytes(request);
    tasks.Add(webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None));
}

await Task.WhenAll(tasks);

var resultArray = tasks.Select(t => t.Result).ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...