2016-10-11 13 views
0

これは私の問題です:C#/ ASP.Netはリストを変更しています...これは問題を引き起こしますか?

私はアップロードされているすべてのファイルを格納するオブジェクトの静的なリストを持っています。

private static List<Upload> vidUploadList = new List<Upload>(); 

リストを維持するには、失敗したアップロードをリストから削除する必要があります。私の質問です:ユーザーがリストを変更すると、リスト内の項目のインデックスが変更されます。別のユーザーがループコマンドを使用してリストの途中にあり、リストが変更されている可能性はありますか?たとえば、リストの項目[3]が使用されていて、前のオブジェクトが削除された場合(位置を[2]に変更した場合)、コードはまだ実行されますか?

リストを使用するユーザがいればロックすることができますか?一度に1つのセッションだけがリストにアクセスしていることを確認してロックを解除しますか?モニターのクラスが私を助けてくれると聞いたことがあります。

+0

などのようにConcurrentCollectionを使用することを検討し、グローバルアイテム以外はウェブと混在させないでください。すべてのユーザーが同じコレクションを共有するため、これは静的ではないと思われます。 – TyCobb

+1

はい、あなたが同時にリストから読んだり書いているのであれば、物事はかなり素早く台無しになるでしょう。 ['System.Concurrent.Collections'](https://msdn.microsoft.com/en-us/library/system.collections.concurrent(v = vs.110).aspx)のコレクションを使用することもできますまだ、ウェブサーバ内のすべての状態を放棄し、データベースを使用します。 – spender

+0

ApplicationPoolが廃棄される場合、リスト内のすべてのインフォメーションが消えてしまうことに注意してください。 – HeW

答えて

-1

Visual Studio 2013でC#を使用したとき、コンパイラは、foreachを使用してループしている間にリストが変更されていることが明らかであれば文句を言います。しかし、リストのサイズを見つけてfor loopを使ってループすると、コンパイルが失敗するとは思われません。しかし、実行が不安定になる可能性があるので、それはまだ良い習慣ではありません。ここにはlock your listへのリンクがあります。

+0

これはコンパイル時エラーではありません。 – Amy

1

コードはまだ実行されますか?

InvalidOperationException「コレクションが変更された。列挙操作が実行されないことがあり、」NO、

をスローされます、あなたが本当に許可したい場合は、実際にこの単純なコード

List<int> test = new List<int>(){ 1, 2, 3, 4, 5}; 
foreach(int i in test) 
    test.Remove(i); //Exception 

でそれを試すことができます複数のユーザーがそれを編集する場合は、ConcurrentBag

関連する問題