Как мне поделиться большим списком<T> только для чтения с каждым методом Task.Factory.StartNew()

Учтите, что у меня есть пользовательский класс Terms и этот класс содержит ряд свойств строк. Затем я создаю довольно большой (скажем, 50000) List<Terms> объект. это List<Terms> нужно только прочитать из него, но это должно быть прочитано из нескольких экземпляров Task.Factory.StartNew (количество экземпляров может варьироваться от 1 до 100 с).

Как мне лучше передать этот список в долгосрочную задачу? Память не слишком важна, так как это специальное приложение для конкретного использования на конкретном сервере с большим объемом памяти. Должен ли я ссылаться на него или я должен просто выдать его как обычный аргумент в методе, выполняющем работу?

2 ответа

Решение

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

Тем не менее, просто с точки зрения стиля кодирования и удобства сопровождения, я бы, вероятно, попытался передать его в качестве параметра любому методу, который вы выполняете в своем Task.Factory.StartNew() (или еще лучше, Task.Run() - смотрите здесь). Таким образом, вы четко обозначили зависимости своей задачи, и если вы решите, что вам нужно получить список из какого-то другого места, становится более ясным, что вы должны изменить. (Но вы, вероятно, могли бы найти 20 мест в моем собственном коде, где я не следовал этому правилу: иногда я иду с тем, что для меня легче, чем с тем, что, вероятно, будет легче для меня через шесть месяцев.)

Поскольку вы передаете ссылку, на самом деле не имеет значения, как вы ее передаете, она не будет копировать сам список. Как сказал Кет Смит, я бы передал его в качестве параметра выполняемому вами методу.

Вопрос List<T> не является полностью потокобезопасным. Чтение несколькими потоками безопасно, но запись может вызвать некоторые проблемы:

Безопасно выполнять несколько операций чтения над списком, но могут возникнуть проблемы, если коллекция будет изменена во время чтения. Чтобы обеспечить безопасность потоков, заблокируйте коллекцию во время операции чтения или записи.

От List<T>

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

Я рекомендую использовать ImmutableList<T> который по своей природе потокобезопасен, так как он неизменен.

Другие вопросы по тегам