2016-09-04 3 views
1

はじめ繰り返しでコレクションを編集しますか?

私は、インターネットからいくつかのデータをこすりアプリケーションを構築しています。 削られたデータはリアルタイムで更新する必要があるため、以前のページソースが変更されたかどうかを毎回チェックする無限ループ を実行しています。 すべてのこれらのデータは、このようなObservableCollection内部に格納されています

private static ObservableCollection<Models.Event> _allMatches = new ObservableCollection<Models.Event>(); 

public ObservableCollection<Models.Event> AllMatches 
{ 
    get { return _matches; } 
} 

このO bservableCollectionは、次のようListViewにバインドされ:

<CollectionViewSource Source="{Binding AllMatches}" x:Key="GroupedItems"> 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="MatchNation" /> 
     <PropertyGroupDescription PropertyName="MatchLeague" /> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

CollectionViewSourceGroupStyleListViewにデータを整理するために私を助けて、この場合はNation -> Leagueです。

問題は、私は、問題をよりよく説明するための簡単なコード例を作成してみましょう

を開始します。各データはイベントによって一致するので、私は本質的にObservableCollectionのイベントのリストを持っています。

例コード:

string oldData = null; 
List<Event> matchListAll = new List<Event>(); 

while(true) 
{ 
     string data = new WebClient().DownloadString("websiteLink"); 

     if(data != oldData) //There is an update! Get the new content 
     { 
      //code for scrape the event 

      foreach(var item in ItemScraped) 
      { 
        Event @event = new Event(); //this will contain the details of event scraped 
        @event.Date = item.Date; //and so on... 

        matchListAll.Add(@event); //Add the event to a list 
      } 

      //when the scraping iteration is over I put all of this event in the ObservableCollection 
      AddAllListItem(matchListAll); 
     } 
} 

今上記のコードは、それはそれだ、インターネットからイベントを取得し、そのオブジェクトに入れて、本当に簡単です。 私はAddAllListItemを呼び出す掻き取りが完了したら、このメソッドはListViewにバインドされたObservableCollectionを評価します。

この方法の構造はこれです:

private void AddAllListItem(List<Event> matches) 
{ 
    var allCollection = VM.AllMatches; //Access to AllMatches through the Vm (VM contain the ViewModel instance) 

    foreach (var @event in matches) //Iterate through the element scraped 
    { 
     //Add the scraped element to ObservableCollection so I can see it. 
     allCollection.Add(new Event 
     { 
      MatchDate = @event.MatchDate, 
      ... 
     }; 
    } 
} 

このコードは、深刻な問題を抱えています。私は誰かがすでに何が起こったのか考え出したと思います。

特にObservableCollectionの項目にAddAllListItemが追加されました。もう一度 が呼び出され、パラメータとして渡された一致項目が変更されました。これにより、 の例外が生成されます。

コレクションが変更されました。列挙操作が実行されないことがあります。

この状況を解決するにはどうすればよいですか?

私はこの問題にここで尋ねたいくつかの質問を読んで、他方は.ToListまたは.ToArrayを使用することをお勧めしますが、私はのObservableCollectionをしたし、その間、私はそれらを更新することも必要画面上の要素を示しています。 私はそのような状況に遭遇したことはありません。そして、誰かが私に助けを借りて、 の問題を解決し、それを解決するのを助けてくれることを願っています。

+2

これは、「あなたの毒を選ぶ」状況の1つです。ロックを使用するか、ToList/ToArrayを使用します。 – dasblinkenlight

答えて

0

多分、これはあなたを助けるでしょう。

+0

私はあなたのコードを少し勉強する必要があります。IClonableは使用しませんでした。ありがとう。 – AgainMe

+0

コードを編集します。 – FreeMan

+0

この使い方を教えてもらえますか? – AgainMe

関連する問題