私は、インターネットからいくつかのデータをこすりアプリケーションを構築しています。 削られたデータはリアルタイムで更新する必要があるため、以前のページソースが変更されたかどうかを毎回チェックする無限ループ を実行しています。 すべてのこれらのデータは、このような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>
CollectionViewSource
はGroupStyle
とListView
にデータを整理するために私を助けて、この場合は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をしたし、その間、私はそれらを更新することも必要画面上の要素を示しています。 私はそのような状況に遭遇したことはありません。そして、誰かが私に助けを借りて、 の問題を解決し、それを解決するのを助けてくれることを願っています。
これは、「あなたの毒を選ぶ」状況の1つです。ロックを使用するか、ToList/ToArrayを使用します。 – dasblinkenlight