2014-12-22 1 views
0

Terms이라는 사용자 지정 클래스가 있으며 그 클래스에는 여러 문자열 속성이 포함되어 있다고 가정합니다. 그런 다음 상당히 큰 (예 : 50,000) List<Terms> 개체를 만듭니다. 이 List<Terms>은 읽을 필요가 있지만 Task.Factory.StartNew의 여러 인스턴스에서 읽어야합니다 (인스턴스 수는 1에서 100까지 다양합니다).각 Task.Factory.StartNew() 메서드로 큰 읽기 전용 목록 <T>을 어떻게 공유해야합니까?

장기 실행 작업에 어떻게 그 목록을 전달하는 것이 가장 좋을까요? 메모리가 많은 특정 서버에서 특정 용도로 사용하기 위해 사용자 정의 응용 프로그램이므로 메모리는별로 중요하지 않습니다. 나는 그것을 참조해야 하는가? 아니면 나는 그것을 일을하는 방법에 대한 일반적인 논증으로 그냥 넘겨 주어야 하는가?

+0

옵션을 사용하면 목록을 여러 부분으로 나누어 따로 읽을 수 있지만 @KenSmith –

+0

에 동의합니다. 목록에서만 읽는 경우 - 참조 또는 일반 매개 변수를 전달하면 List가 객체. –

+0

@ 존즈. 그건 의미가 있습니다. 감사! – MysticRyuujin

답변

1

각 작업을 개 복사하지 않으려 고해서는 안됩니다. 다른 것보다 코딩 스타일이 더 중요합니다. 각 작업은 여전히 ​​동일한 기본 목록에 대한 참조 만 메모리에서 동일한 목록으로 작동합니다. 스타일과 유지 보수를 코딩의 문제로 sheerly 말했다

, 아마 당신이 당신의 Task.Factory.StartNew()에서 실행하든 메서드에 매개 변수로에서 통과하려고 것 (더 나은 아직, Task.Run() 또는 - here 참조). 그런 식으로, 당신은 당신의 작업의 의존성을 분명하게 알았고, 다른 곳에서 목록을 가져와야 할 필요가 있다고 결정하면, 무엇을 바꾸어야하는지 명확히 알 수 있습니다. (하지만 당신은 내가 그 규칙을 지키지 않은 곳에서 20 개 장소를 찾을 수 있습니다. 지금부터 6 개월 후에 나에게 더 편할 가능성이있는 것보다 나에게 더 편할 때가 있습니다.)

2

참조를 전달하기 때문에 전달 방법은 중요하지 않습니다. 목록 자체를 복사하지는 않습니다. Ket Smith가 말했듯이, 나는 당신을 실행중인 메소드의 매개 변수로 전달할 것이다.

문제는 List<T>은 스레드로부터 안전하지 않습니다. 여러 스레드에 의한 읽기는 안전하지만 쓰기로 인해 몇 가지 문제가 발생할 수 있습니다.

List에서 여러 읽기 작업을 수행하는 것이 안전하지만 읽는 동안 컬렉션이 수정되면 문제가 발생할 수 있습니다. 스레드 안전성을 보장하려면 읽기 또는 쓰기 작업 중에 컬렉션을 잠급니다.. List<T>

에서

당신은 당신의 목록 읽기 전용이 아닌 문제가 될 수 있도록 말하지만, 하나의 예측할 수없는 변화가 예기치 않은 동작이 발생할 수 있고, 그래서 버그가 발생하기 쉬운입니다.

ImmutableList<T>입니다. 본질적으로 스레드 안전은 변경 불가능하므로 사용하는 것이 좋습니다.

+2

'ImmutableList '사용에 동의했습니다. 자신의 코드를 절대로 믿지 마십시오 :-). –