Задать вопрос
Shirixae
@Shirixae

.NET — общий доступ к коллекции?

Проблема такая: есть подписка на событие, по которому обновляется коллекция.

this.Trader.NewOrders += orders => this.GuiAsync(() => _ordersWindow.Orders.AddRange(orders)); //GuiAsync это аналог Dispatcher.BeginInvoke из фреймворка, с которым работаю



есть таймер, в котором вызывается функция

public void OnTimedEvent(object source, ElapsedEventArgs e)
    {  
        if (MainWindow.Instance._tradesWindow.Trades[MainWindow.Instance._tradesWindow.Trades.Count() - 1].Time >= startTime)
        {
            var trade = MainWindow.Instance._tradesWindow.Trades[MainWindow.Instance._tradesWindow.Trades.Count() - 1];
            if (trade.Price != Cc)
                MainWindow.Instance.Dispatcher.BeginInvoke(new CheckNewStrikeA1Delegate(CheckNewStrikeA1), trade.Price);
        }  
    }



внутри функции происходят некоторые действия, после которых меняется _ordersWindow.Orders

void CheckNewStrikeA1(double strike)
{            
    lock (myLock2)
    {                    
        A1_P_51(strike);
    }    
 
    if (IsNewTrade() == false) //эта функция смотрит в _ordersWindow.Orders  
        return;



Но, если _ordersWindow.Orders изменилось после прохождения A1_P_51(strike), IsNewTrade изменений не видит. Видит только при следующем тике таймера.

В какую сторону смотреть?
  • Вопрос задан
  • 2886 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@bacz
Сделать общие локи для добавления, подсчета и проверки, к примеру так:

this.Trader.NewOrders += orders => this.GuiAsync(() => { lock(myLock2) { _ordersWindow.Orders.AddRange(orders); } }); //GuiAsync


void CheckNewStrikeA1(double strike)
{
  lock (myLock2)
  {
    A1_P_51(strike);

    if (IsNewTrade() == false) //эта функция смотрит в _ordersWindow.Orders
       return;
  }
}


Если я вас правильно понял.
Ответ написан
Shirixae
@Shirixae Автор вопроса
не совсем, как раз наоборот =) во время исполнения функции A1_P_51 происходит событие this.Trader.NewOrders и на момент вызова IsNewTrade _ordersWindow.Orders уже изменен, но IsNewTrade видит «старую» версию _ordersWindow.Orders, ту, которая была при запуске CheckNewStrikeA1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы