Я пытаюсь получить данные об уровне тиков из потока агрегированных данных Binance. Как только дата меняется, функция обрабатывает данные предыдущего дня. Я использую Task.Run для создания другого потока, так как новые данные за текущий день все еще поступают в потоковом режиме и должны быть захвачены. Однако я получаю сообщение «Коллекция была изменена, операция перечисления может не выполняться». в цикле foreach функции, обрабатывающей данные. Я не уверен, почему tradeData будет изменен после того, как он будет передан функции обработки? Не уверен, что это имеет значение, но я фиксирую около 40 различных символов в отдельных потоках.
private static void Start()
{
foreach (SymbolData symbol in symbolData)
{
Task.Run(() => SubscribeToSymbol(symbol.symbol));
}
}
private static void SubscribeToSymbol(string symbol)
{
Dictionary<decimal, decimal> tradeData = new Dictionary<decimal, decimal>();
DateTime lastTrade = DateTime.UtcNow;
try
{
var socketClient = new BinanceSocketClient();
socketClient.FuturesUsdt.SubscribeToAggregatedTradeUpdates(symbol, data =>
{
if (data.TradeTime.Date > lastTrade.Date)
{
Task.Run(() => ProcessData(symbol, lastTrade.Date, tradeData));
tradeData.Clear();
}
lastTrade = data.TradeTime;
if (tradeData.ContainsKey(data.Price))
{
tradeData[data.Price] = tradeData[data.Price] + data.Quantity;
}
else
{
tradeData[data.Price] = data.Quantity;
}
});
}
catch { }
}
private static void ProcessData(string symbol, DateTime date, Dictionary<decimal, decimal> tradeData)
{
foreach (var price in tradeData)
{
//Error: Collection was modified enumeration operation may not execute.
}
}
catch { }
Не делайте этого. Как минимум запишите что-нибудь. Такое исключение только усложнит диагностику проблем с вашим кодом. - person   schedule 12.01.2021tradeData
во время его обработки:ProcessData
может работать параллельно сtradeData[data.Price] = tradeData[data.Price] + data.Quantity;
илиtradeData[data.Price] = data.Quantity;
, потому что вы начали его сTask.Run()
. - person Xaver   schedule 12.01.2021