Изменение Order.StopCondition.Parameters в стоп-заявке, после Order.State == Done
Добрый день.
Я создаю стоп-завку StopLimit типа.
В методе, который подписан к событию Quik.StopOrdersChanged, я проверяю условие Order.State == OrderStates.Done.
Если это условие выполнилось, то я записываю ордер в SQL.
При формировании данных для SQL я пробегаю циклом foreach по словарю Order.StopCondition.Parameters.
Но во время этого пробега, появляется ошибка «Collection was modified; enumeration operation may not execute.»
Правильно ли я понимаю, что после того, как заявка стала Done, в ней ничего уже не должно изменяться?
Помогите, пожалуйста, разобраться это баг или фича?
Возможно я что-то понимаю и делаю не так?
Код формирования стоп-заявки
Код
Order _newOrder = new Order
{
Type = OrderTypes.Conditional,
Volume = __volume,
Price = Price,
Security = paperSecurity,
Direction = __direct,
ExpiryDate = DateTime.MaxValue,
Portfolio = PortfolioStock,
StopCondition = new QuikStopCondition
{
Type = QuikStopConditionTypes.StopLimit,
StopPrice = PriceHSignal,
ActiveTime = null
}
};
Код записи заявки в SQL
Код
private static void writeOrdersToSql(IEnumerable<Order> __orders)
{
using (SqlConnection _sqlConn = new SqlConnection(SqlQuik.SqlConnStr))
{
_sqlConn.Open();
foreach (Order _order in __orders)
if (_order.State == OrderStates.Done)
{
// Узнаем условие стоп заявки, если это стоп заявка
String _stopCondition = String.Empty;
if (_order.StopCondition != null)
foreach (var _param in _order.StopCondition.Parameters)
if (_param.Value != null)
_stopCondition += _param.Key + " : " + _param.Value.ToString() + "; ";
if (_stopCondition == String.Empty)
_stopCondition = "NULL";
else
_stopCondition = "'" + _stopCondition + "'";
// Формирование строки SQL и запись в SQL
// ..................................
}
}
}
Message
Код
"Collection was modified; enumeration operation may not execute."
StackTrace
Код
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
at FirmName.ProgrammName.SqlQuik.writeOrdersToSql(IEnumerable`1 __orders) in D:\C\FirmName\FirmNameSolution\ProgrammName\SqlQuik\SqlQuik.cs:line 376
at FirmName.ProgrammName.SqlQuik.<>c__DisplayClass8.<quik_OrdersChanged>b__7() in D:\C\FirmName\FirmNameSolution\ProgrammName\SqlQuik\SqlQuik.cs:line 335
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()