Linq safe thread ?
От: Аноним  
Дата: 27.06.13 00:55
Оценка:
Привет.

Возник вопрос, разве Linq запросы не потокобезопасны ?
почему я мог поймать такую ошибку :
при краше (приложение будет закрыто я заметил — коллекция была изменена...), а в системном журнале :
Приложение: Server.exe
Версия платформы: v4.0.30319
Описание. Процесс был завершен из-за необработанного исключения.
Сведения об исключении: System.InvalidOperationException
Стек:
   в System.ThrowHelper.ThrowInvalidOperationException(System.ExceptionResource)
   в System.Collections.Generic.List`1+Enumerator[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MoveNextRare()
   в System.Collections.Generic.List`1+Enumerator[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MoveNext()
   в System.Linq.Enumerable+WhereSelectListIterator`2[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MoveNext()
   в System.Linq.Enumerable.Contains[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](System.Collections.Generic.IEnumerable`1<System.__Canon>, System.__Canon, System.Collections.Generic.IEqualityComparer`1<System.__Canon>)
   в System.Linq.Enumerable.Contains[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](System.Collections.Generic.IEnumerable`1<System.__Canon>, System.__Canon)
   в Server.Form1.IfExch(System.String)
   в Server.Form1.StartServerWork()
   в Server.Form1.<Form1_Load>b__15()
   в System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
   в System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   в System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   в System.Threading.ThreadHelper.ThreadStart()


  public class ToPoint
    {
        public string ip;
        private string Adr;
        private string topath;

        public string ToPath
        {
            get { return topath; }
            set { topath = value; }
        }
        public string adr
        {
            get { return Adr; }
            set 
            { 
                string from = ".adr";
                string to   = ".dat";
                if (value.Contains(".madr"))
                {
                     from = ".madr";
                     to = ".mdat";
                }
                Dat = value.ToLower().Replace(from,to); 
                Adr = value;
            }
        }
        private string Dat;
        public string dat
        {
            get { return Dat; }            
        }
        public POINT_STATUS ps;
        public POINT_STATUS recv; 
    }
private List<ToPoint> pointlist;
public bool IfExch(string ip)
 {
  if (pointlist == null)
      return false;
  return (from sel in pointlist.ToArray() select sel.ip).Contains(ip);
 }


в чем может быть проблема ?
Re: Linq safe thread ?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.06.13 01:47
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>в чем может быть проблема ?


http://msdn.microsoft.com/en-us/library/78dfe2yb.aspx

An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection, such as adding, modifying, or deleting elements, the enumerator is irrecoverably invalidated and its behavior is undefined.

The enumerator does not have exclusive access to the collection; therefore, enumerating through a collection is intrinsically not a thread-safe procedure. To guarantee thread safety during enumeration, you can lock the collection during the entire enumeration. To allow the collection to be accessed by multiple threads for reading and writing, you must implement your own synchronization.

Default implementations of collections in the System.Collections.Generic namespace are not synchronized.

Re[2]: Linq safe thread ?
От: Аноним  
Дата: 27.06.13 03:23
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Аноним, Вы писали:


А>>в чем может быть проблема ?


N>http://msdn.microsoft.com/en-us/library/78dfe2yb.aspx


N>

N>An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection, such as adding, modifying, or deleting elements, the enumerator is irrecoverably invalidated and its behavior is undefined.

N>The enumerator does not have exclusive access to the collection; therefore, enumerating through a collection is intrinsically not a thread-safe procedure. To guarantee thread safety during enumeration, you can lock the collection during the entire enumeration. To allow the collection to be accessed by multiple threads for reading and writing, you must implement your own synchronization.

N>Default implementations of collections in the System.Collections.Generic namespace are not synchronized.


Спасибо.
я так понял что (from sel in pointlist.ToArray() select sel.ip) и отрабатывает корректно без ошибки,а из-за
(from sel in pointlist.ToArray() select sel.ip).Contains(ip); я ловлю экзэпшен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.