Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > многопоточный доступ к IEnumerable<T>


Автор: Stas123 8.8.2011, 14:35
моя программ получает данный через различные промежутки времени.
Когда программа получает данные происходит событие 
Код

this.NewMyTrades += mytrades => {
                MessageBox.Show("Event");
                                    
WaitMyTradesComplement();
                    this.Stop();
                            };
 
эти данные также записываются в IEnumerable<MyTrades>, и происходит проверка того, что пришли все данные.
Для этого вызывается метод WaitMyTradesComplement() и все хорошо работает.
Код

private void WaitMyTradesComplement()
        {
            //MessageBox.Show(_nMyTrades.ToString() + " " + this.MyTrades.Count.ToString());
            while(true){
                Thread.Sleep(1000);
                if(IsLastTradeByOrderInList()){
                    //if(_nMyTrades != this.MyTrades.Count){
                    _nMyTrades = this.MyTrades.Count();
                    break;
                }
                
            }
        }
        
        private bool IsLastTradeByOrderInList()
        {
            List<MyTrade> MyTrades = new List<MyTrade>(this.MyTrades);
            //lock(this){
            if(MyTrades.Count() > 0
               && MyTrades.Last().Order.Id == _order.Id
               && MyTrades.Last().Order.IsMatched()){
                return true;
            }
                        
            return false;
            //}
        }

Если в последний метод добавить проход по все элементам листа, то в лист попадает только первая часть данных, остальный не попадают.
С чем это связано?
Код

private bool IsLastTradeByOrderInList()
        {
            List<MyTrade> MyTrades = new List<MyTrade>(this.MyTrades);
            //lock(this){
            if(MyTrades.Count() > 0
               && MyTrades.Last().Order.Id == _order.Id
               && MyTrades.Last().Order.IsMatched()){
                return true;
            }
                int sumOfTrades = 0;
                for(int i = 0 ; i < MyTrades.Count(); i++){
                    if(MyTrades[i].Order.Id == _order.Id){
                        sumOfTrades += MyTrades[i].Trade.Volume;
                    }
                }
                if(sumOfTrades == MyTrades.Last().Order.Volume){
                    return true;
                }
                else{
                    return false;
                }

        
            
            //}
        }


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)