我有一连串的请求。每个请求都是单独的线程。每个线程都由一个函数创建 (
GetHistoryData(securityCode)
)。
所有请求都会等待由另一个函数创建的另一个线程获得的响应 (
handleCallback(input)
)。
现在我有一系列初始请求和最终响应。
例如应用程序发出请求:
并收到回复
问题是响应的顺序可能与请求的顺序不同。当我开始使用 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# 中同时执行多项操作: “同步”:
Task.WhenAny
,例如,请参阅 在异步任务完成时对其进行处理 (C#);Parallel.ForEach
和Parallel.ForEachAsync
;有关示例,请参阅如何:编写简单的 Parallel.ForEach 循环