在我的任务中使用什么来同步 C# 中的异步请求和响应?

问题描述 投票:0回答:1

我有一连串的请求。每个请求都是单独的线程。每个线程都由一个函数创建 (

GetHistoryData(securityCode)
)。

所有请求都会等待由另一个函数创建的另一个线程获得的响应 (

handleCallback(input)
)。

现在我有一系列初始请求和最终响应。

  • 每个响应必须与相应的请求相关
  • 每个响应都可以通过请求顺序以外的其他顺序获得。

例如应用程序发出请求:

  • 请求1获取美元历史数据
  • 请求2获取Apple历史数据
  • request3 获取 Google 历史数据

并收到回复

  • 美元历史数据反应1
  • Google历史数据的响应2
  • 苹果历史数据的回应3

问题是响应的顺序可能与请求的顺序不同。当我开始使用 AutoResetEvent 将此代码用于多线程目的时,它导致线程等待响应接收另一个线程的响应

如何同步?对于这种情况我应该使用什么?

也许您知道这种情况的任何模式?

我尝试使用不同的解决方案,例如 Monitor、AutoresetEvent 等,但是..

在我将其用于多线程任务之前,部分代码是正确的。对于多线程任务,此代码不正确,我正在寻找解决方案。

public List<candle> GetHistoryData(string seccode, boardsCode board = boardsCode.FUT, SecurityPeriods periodId = SecurityPeriods.M1, int candlesCount = 1)
{
    candle res = null;
    command com = command.CreateGetHistoryDataCommand(board, seccode, periodId, candlesCount);
    result sendResult = ConnectorSendCommand(com, typeof(command));
    if (sendResult.success == true)
    {
        _candlesLoaded.WaitOne();
    }
    else
    {
        throw new Exception(sendResult.message);
    }
    return _candles.candlesValue;
}

protected override void _handleData(String result)
{
    string nodeName = _getNodeName(result);
    switch (nodeName)
    {
        case "candles":
            var candles = (candles)XMLHelper.Deserialize(result, typeof(candles));
            _currentCandle = candles.candlesValue[0];
            _candles = candles;
            _candlesLoaded.Set();
            break;
    }
}
c# multithreading asynchronous
1个回答
-1
投票

代码显示似乎遗漏了重要的部分,并且显示的位有未使用的元素,因此提供精确的答案并不容易,但一般来说,有两种简单的机制可以在 C# 中同时执行多项操作: “同步”:

  1. Task.WhenAny
    ,例如,请参阅 在异步任务完成时对其进行处理 (C#);
  2. Parallel.ForEach
    Parallel.ForEachAsync
    ;有关示例,请参阅如何:编写简单的 Parallel.ForEach 循环
© www.soinside.com 2019 - 2024. All rights reserved.