2015-06-02 2 views
3

У меня есть следующий код:Список изменений извне, а итерируемая

private static List<String> MyList; 

    static void Main() 
    { 
     MyList = new List<String>(); 

     var websocketClient = new WebSocket("wss://ws.mysite.com"); 
     websocketClient.MessageReceived += IterateMyList; 

     var updateListTimer = new Timer(); 
     updateListTimer.Elapsed += UpdateMyList; 

     Console.ReadLine(); 
    } 

    public static void IterateMyList(object sender, EventArgs e) 
    { 
     foreach (var item in MyList) 
     { 
      //Do Something with the item 
     } 
    } 

    public static void UpdateMyList(object sender, EventArgs e) 
    { 
     // Add new items to and remove items from MyList. 
    } 

Что происходит, когда таймер тика и новые события WebSocket сообщения сталкиваются?

IterateMyList() будет выполнять итерацию MyList и UpdateMyList() будет обновлять его одновременно.

Получу ли я исключение?

+3

Посмотрите на 'ConcurrentBag' – SimpleVar

ответ

1

При попытке вставить во время итерации вы создадите исключение и получите сообщение об ошибке «Чтение или запись защищенной памяти».

Для решения этой проблемы используйте ConcurrentBag<T> или other concurrent collecton. Эти объекты Collection являются потокобезопасными. Если вам не нужен порядок, я рекомендую использовать ConcurrentBag по соображениям производительности.