Многопоточный способ добавлять и удалять элементы из списка в .Net - PullRequest
0 голосов
/ 30 июля 2009

Я хочу добавить элементы в список из одного потока, а из другого потока удалить элементы из этого списка. Однако я не уверен, что у меня возникнут проблемы с несколькими потоками, обращающимися к одному и тому же объекту. Я немного прочитал оператор блокировки, но я не уверен, как это реализовать. Короче говоря, вопрос в том, как мне обеспечить потокобезопасный доступ к моему списку.

Ответы [ 3 ]

4 голосов
/ 30 июля 2009

Использовать SyncRoot в IList:

lock(SomeList.SyncRoot) {...}
1 голос
/ 30 июля 2009

Если вы работаете с системой производитель / потребитель - и звучит так, как будто вы - синхронизированная очередь звучит как более подходящая структура, а не как список.

0 голосов
/ 30 июля 2009

Вот ЧРЕЗВЫЧАЙНО грубый пример блокировки. Оба потока теперь безопасны при добавлении и удалении из списка. Это не пример того, как создавать и использовать потоки - просто пример того, как использовать блокировку.

  Class A{
            private List<int> _list = new List<int>();

            private void DoOtherThreadWork() {
                while (true) {
                    //so something with thread. Sleep it, whatever...
                    lock(_list) {
                        _list.Add(1);
                    }
                }    
            }

            private void StartWorking(object sender, EventArgs e) {
                Thread worker = new Thread(DoOtherThreadWork);
                worker.Start();

                while (true) {
                    lock(_list) {
                        if (_list.Count > 0) {
                            _list.RemoveAt(0);
                        }
                    }
                }
            }
    }

Возможно, мне также следует добавить, что для чего-то более сложного, чем этот базовый пример, вы можете использовать другой объект в самом списке.

private object lockObj = new Object();
        private void DoOtherThreadWork() {
                while (true) {
                    //so something with thread. Sleep it, whatever...
                    lock(_lockObj ) {
...