Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> многопоточный доступ к IEnumerable<T> 
:(
    Опции темы
Stas123
Дата 8.8.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.11.2009

Репутация: нет
Всего: нет



моя программ получает данный через различные промежутки времени.
Когда программа получает данные происходит событие 
Код

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;
                }

        
            
            //}
        }


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0522 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.