Михаил, добрый день.
Помогите, пожалуйста, найти причину ошибки.
Описание ситуации:
периодически, приблизительно раза два в неделю, при работе S# c Квиком возникает ошибка.
В остальное время все работает без ошибки.
Описание исключения из дебагера:
Код
ex {"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."}
[System.AccessViolationException] {"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."}
Data {System.Collections.ListDictionaryInternal}
HelpLink null
InnerException null
Message "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
Source "mscorlib
StackTrace
at System.StubHelpers.ValueClassMarshaler.ConvertToManaged(IntPtr dst, IntPtr src, IntPtr pMT)\r\n
at Ecng.Interop.WinApi.GetMenuItemInfo(IntPtr hMenu, UInt32 uItem, Boolean fByPosition, MenuItemInfo& lpmii)\r\n
at Ecng.Interop.ManagedWinApiHelper.GetMenuItems(IntPtr hMenu, SystemWindow window)\r\n
at Ecng.Interop.SystemMenu..ctor(IntPtr hMenu, SystemWindow window)\r\n
at Ecng.Interop.ManagedWinApiHelper.GetMenu(SystemWindow window)\r\n
at Ecng.Trading.Quik.QuikTerminal.GetAccounts()\r\n
at Ecng.Trading.Quik.QuikTrader.#=qOpBiLK4QqpviIWtcch8OWgvUqP3awIStT7FRqaHhRZY=.#=qCEoE_nVJQF0bssPXr1HgDhv_eIFFIbEByDSR6PGDD1A=()\r\n
at Ecng.Trading.Algo.BaseTrader.ProcessEvents(Action handler)
TargetSite {Void ConvertToManaged(IntPtr, IntPtr, IntPtr)}
Ошибка возникает при исполнении участка кода:
Код
// Подписываемся на событие соединения с квик
Global.Quik.Connected += () =>
{
_waitConnected.Set();
};
// Подписываемся на событие появление портфеля
Global.Quik.NewPortfolios += portfolios =>
{
Portfolio _portfolio = portfolios.FirstOrDefault(p => p.Name == Global.SqlQuikProperty.QuikAccount);
if (_portfolio != null)
{
Global.Portfolio = _portfolio;
_waitPortfolio.Set();
}
};
// Соединяемся с Quik
Global.Quik.Connect();
if (_waitConnected.WaitOne(10000) == false)
throw new Exception("We try connect to Quik, but have reach timeout");
if (_waitPortfolio.WaitOne(10000) == false)
throw new Exception("We try connect to get Portfolio, but have reach timeout");
Более конкретно — ошибка возникает при исполнении вот этой строчки:
Код
if (_waitPortfolio.WaitOne(10000) == false)
При этом ошибка возникает не в выше описанном коде, а ошибка ловится обработчиком события BaseTrader.ProcessDataError
Решить вопрос удается только логофом пользователя, после чего необходимо подождать некоторое время,
прежде чем повторно входить под этим пользователем.