У меня есть приложение быстрого исправления .net. я использую .net / c ++ версия быстрого исправления
Иногда мое приложение выдает эту ошибку, и я не могу поймать ее с помощью блока try catch.
Длина сообщений об исправлении составляет около 3000. Я не получаю эту ошибку каждый раз.
Это журнал событий:
Framework Framework: v4.0.30319 Описание: процесс был прерван
из-за необработанного исключения. Информация об исключении:
Стек System.AccessViolationException: в
System.String..ctor (SByte *) в
QuickFix.Group.getField (QuickFix.StringField) в
FixApplication.onMessage (QuickFix44.MarketDataIncrementalRefresh,
QuickFix.SessionID) в
QuickFix44.MessageCracker.crack (QuickFix.Message, QuickFix.SessionID)
на QuickFix.MessageCracker.crack (QuickFix.Message, QuickFix.SessionID,
QuickFix.BeginString) в
QuickFix.MessageCracker.crack (QuickFix.Message, QuickFix.SessionID)
в FixApplication.fromApp (QuickFix.Message,
QuickFix.SessionID) в .Application.fromApp (Приложение *,
FIX.Message *, FIX.SessionID *)
Строка, которая выдает ошибку:
public override void onMessage(QuickFix44.MarketDataIncrementalRefresh msg, SessionID sessionID)
{
try
{
var mdReqId = new MDReqID();
if (msg.isSet(mdReqId))
msg.get(mdReqId);
var noMdEntries = new NoMDEntries();
if (msg.isSet(noMdEntries))
msg.get(noMdEntries);
int noMdEntriesInt;
if (Int32.TryParse(noMdEntries.ToString(), out noMdEntriesInt))
{
for (uint i = 1; i <= noMdEntriesInt; i++)
{
var group = new MarketDataIncrementalRefresh.NoMDEntries();
Group repeatedData;
if (msg.isSet(noMdEntries))
{
repeatedData = msg.getGroup(i, group);
var mdUpdateAction = new MDUpdateAction();
if (repeatedData.isSetField(mdUpdateAction))
repeatedData.getField(mdUpdateAction);
var mdEntryType = new MDEntryType();
if (repeatedData.isSetField(mdEntryType))
repeatedData.getField(mdEntryType);
var symbol = new Symbol();
if (repeatedData.isSetField(symbol))
repeatedData.getField(symbol);
var mdEntryPx = new MDEntryPx();
if (repeatedData.isSetField(mdEntryPx))
repeatedData.getField(mdEntryPx);
var mdEntrySize = new MDEntrySize();
if (repeatedData.isSetField(mdEntrySize))
repeatedData.getField(mdEntrySize);
var numberOfOrders = new NumberOfOrders();
if (repeatedData.isSetField(numberOfOrders))
repeatedData.getField(numberOfOrders);
var mdEntryPositionNo = new MDEntryPositionNo();
if (repeatedData.isSetField(mdEntryPositionNo))
repeatedData.getField(mdEntryPositionNo);
var quoteCondition = new QuoteCondition();
if (repeatedData.isSetField(quoteCondition))
repeatedData.getField(quoteCondition);var sysSymbolId = 0;
var mdEntryId = new MDEntryID();
if (repeatedData.isSetField(mdEntryId))
{
repeatedData.getField(mdEntryId);//THIS LINE THROWS ERROR
string strMdEntryId = mdEntryId.getValue();
}
//}
}
}
}
}
Functions.WriteDebugLog("OK");
}
catch (Win32Exception e)
{
Functions.WriteSystemLog("Ex Msg:" + e.ToString() + " Fix Msg : " + msg.ToString());
}
catch (Exception ex)
{
Functions.WriteSystemLog("Ex Msg:" + ex.ToString() + " Fix Msg : " + msg.ToString());
}
}
Это сообщение об ошибке (вы можете разобрать его с помощью этого онлайн-инструмента: http://fixloganalyzer.com/ ):
8 = FIX.4.4 | 9 = 2254 | 35 = Х | 34 = 21998 | 49 =*| 50 =*| 52 = 20140411-07: 52: 52,472 | 56 =**| 262 = 1397202772472 | 268 = 42 | 279 = 1 | 278 = 25500 | 270 = 2,11636 | 271 = 3500000 | 276 = А | 290 = 1 | 279 = 1 | 278 = 25501 | 270 = 2,11626 | 271 = +2000000 | 276 = A | 290 = 2 | 279 = 1 | 278 = 25502 | 270 = 2,11616 | 271 = 3000000 | 276 = А | 290 = 3 | 279 = 1 | 278 = 25504 | 270 = 2,11596 | 271 = 7000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 25510 | 270 = 2,11716 | 271 = 3500000 | 276 = А | 290 = 1 | 279 = 1 | 278 = 25512 | 270 = 2,11736 | 271 = 5000000 | 276 = A | 290 = 3 | 279 = 1 | 278 = 25513 | 270 = 2,11746 | 271 = 5000000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 25514 | 270 = 2,11756 | 271 = 6000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 204 | 270 = 1,38947 | 271 = 1500000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 600 | 270 = 0,93834 | 271 = 1000000 | 276 = А | 290 = 1 | 279 = 1 | 278 = 601 | 270 = 0,93833 | 271 = 1000000 | 276 = А | 290 = 2 | 279 = 1 | 278 = 602 | 270 = 0,93832 | 271 = 1000000 | 276 = А | 290 = 3 | 279 = 1 | 278 = 603 | 270 = 0,93831 | 271 = 2000000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 604 | 270 = 0,93821 | 271 = 2000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 610 | 270 = 0,93839 | 271 = 1000000 | 276 = А | 290 = 1 | 279 = 1 | 278 = 611 | 270 = 0,9384 | 271 = 1500000 | 276 = А | 290 = 2 | 279 = 1 | 278 = 613 | 270 = 0,93843 | 271 = 3500000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 614 | 270 = 0,93844 | 271 = 3000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 2200 | 270 = 1,09337 | 271 = 1000000 | 276 = A | 290 = 1 | 279 = 1 | 27 8 = 2201 | 270 = 1,09336 | 271 = 1000000 | 276 = А | 290 = 2 | 279 = 1 | 278 = 2203 | 270 = 1,09334 | 271 = 4000000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 2204 | 270 = 1,09333 | 271 = 1000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 2211 | 270 = 1,09344 | 271 = 2000000 | 276 = А | 290 = 2 | 279 = 1 | 278 = 2214 | 270 = 1,09356 | 271 = 3000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 19600 | 270 = 1,08182 | 271 = 1000000 | 276 = А | 290 = 1 | 279 = 1 | 278 = 19601 | 270 = 1,08181 | 271 = 1000000 | 276 = А | 290 = 2 | 279 = 1 | 278 = 19602 | 270 = 1,0818 | 271 = 1000000 | 276 = А | 290 = 3 | 279 = 1 | 278 = 19603 | 270 = 1,08179 | 271 = 1000000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 19604 | 270 = 1,08178 | 271 = 1000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 19612 | 270 = 1,08205 | 271 = 1000000 | 276 = А | 290 = 3 | 279 = 1 | 278 = 19613 | 270 = 1,08206 | 271 = 1000000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 19614 | 270 = 1,08216 | 271 = 2000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 23600 | 270 = 1,51927 | 271 = +2000000 | 276 = А | 290 = 1 | 279 = 1 | 278 = 23601 | 270 = 1,51926 | 271 = 1 млн | 276 = A | 290 = 2 | 279 = 1 | 278 = 23602 | 270 = 1,51925 | 271 = 1000000 | 276 = А | 290 = 3 | 279 = 1 | 278 = 23603 | 270 = 1,51915 | 271 = 3000000 | 276 = А | 290 = 4 | 279 = 1 | 278 = 23604 | 270 = 1,51905 | 271 = 4000000 | 276 = А | 290 = 5 | 279 = 1 | 278 = 23610 | 270 = 1,51945 | 271 = 1500000 | 276 = А | 290 = 1 | 279 = 1 | 278 = 23611 | 270 = 1,5194 6 | 271 = 1000000 | 276 = А | 290 = 2 | 279 = 1 | 278 = 23612 | 270 = 1,51947 | 271 = 1000000 | 276 = А | 290 = 3 | 279 = 1 | 278 = 23613 | 270 = 1,51957 | 271 = 2000000 | 276 = А | = 4 290 | 279 = 1 | 278 = 23614 | 270 = 1,51967 | 271 = 3000000 | 276 = А | = 290 5 | 10 = 142 |
это выглядит связанным.
Речь идет о состоянии гонки в объекте Group, который собирает мусор до того, как на него ссылаются.
Вы хотите что-то вроде gcnew
за: .Чистая сборка мусора
Я исправил эту проблему, сделал список запросов.
Пример:
public void RequisitarMarketData(List<String> _lstAtivo, String _mercado, String _id, SessionID sessionId)
{
QuickFix44.MarketDataRequest _marketDataRequest = new QuickFix44.MarketDataRequest();
_marketDataRequest.set(new MDReqID(_id));
_marketDataRequest.set(new SubscriptionRequestType('1'));var anoMDEntryTypes = new QuickFix44.MarketDataRequest.NoMDEntryTypes();
var amdEntryType_bid = new MDEntryType('2');anoMDEntryTypes.set(amdEntryType_bid);
_marketDataRequest.addGroup(anoMDEntryTypes);
_marketDataRequest.set(new MarketDepth(0));
foreach (String _ativo in _lstAtivo)
{
var relatedSymbol = new QuickFix44.MarketDataRequest.NoRelatedSym();
relatedSymbol.set(new Symbol(_ativo));
_marketDataRequest.addGroup(relatedSymbol);
}var relatedSymbola = new QuickFix44.MarketDataRequest.NoRelatedSym();
relatedSymbola.set(new SecurityExchange(_mercado));
_marketDataRequest.addGroup(relatedSymbola);
//Send message
Session.sendToTarget(_marketDataRequest, sessionId);
}`