2011-10-31 1 views
1

에서 읽을 수 없습니다. 내가 총 수를 인쇄하고, 다음 행에서Parallel.ForEach와는 내가 여러 가지가 URL의 피드를 포함하는 텍스트 파일을 폐쇄 TextReader를 예외

var URLs = File.ReadLines(Path.GetFullPath(@"Resources\FeedList.txt")); 

:

Console.WriteLine("Total Number of feeds : {0}",URLs.Count()); 

을 그리고 그 후 나는 Parellel를 사용하고 난 다음 코드를 사용하여 콜렉션 (는 IEnumerable)에서 모든 URL의를 읽고있다. 각각의 URL에 해당하는 로직을 수행하기 위해 각각의 구문. 다음, 나는 코드를 사용하고 있습니다 :

Parallel.ForEach(URLs, (url) => 
             { 
              // Some business logic 
             }); 

문제는, 내가 URL의 예를 호출하는 코드, 백작의 수를 인쇄 최대한 빨리 코드를 추가로 예외를 다음 얻고있다() 메소드 URL 개체. 예외 :

Total Number of feeds : 78 

Unhandled Exception: System.AggregateException: One or more errors occurred. ---> System.ObjectDisposedException: Cannot read from a closed TextReader. 
    at System.IO.__Error.ReaderClosed() 
    at System.IO.StreamReader.ReadLine() 
    at System.IO.File.<InternalReadLines>d__0.MoveNext() 
    at System.Collections.Concurrent.Partitioner.DynamicPartitionerForIEnumerable`1.InternalPartitionEnumerator.GrabNextChunk(Int32 requestedChunkSize) 
    at System.Collections.Concurrent.Partitioner.DynamicPartitionEnumerator_Abstract`2.MoveNext() 
    at System.Threading.Tasks.Parallel.<>c__DisplayClass32`2.<PartitionerForEachWorker>b__30() 
    at System.Threading.Tasks.Task.InnerInvoke() 
    at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask) 
    at System.Threading.Tasks.Task.<>c__DisplayClass7.<ExecuteSelfReplicating>b__6(Object) 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 
    at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) 
    at System.Threading.Tasks.Parallel.PartitionerForEachWorker[TSource,TLocal](Partitioner`1 source, ParallelOptions parallelOptions, Action`1 simpleBody, Action`2 bodyWi 
    at System.Threading.Tasks.Parallel.ForEachWorker[TSource,TLocal](IEnumerable`1 source, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Action`3 
    at System.Threading.Tasks.Parallel.ForEach[TSource](IEnumerable`1 source, Action`1 body) 
    at DiscoveringGroups.Program.Main(String[] args) in C:\Users\Pawan Mishra\Documents\Visual Studio 2010\Projects\ProgrammingCollectiveIntelligence\DiscoveringGroups\Pro 
Press any key to continue . . . 

그리고 카운트 값을 인쇄하는 줄을 제거/주석 처리하면 Parallel.ForEach 루프가 정상적으로 실행됩니다.

사람은 여기에 잘못가는 뭐죠로 어떤 생각을 가지고 있습니까? 당신이 필요하지 않은 경우

+0

'비즈니스 논리'에서 어떤 일이 벌어지고 있습니까? –

답변

4

var 사용하지 마십시오 (또는 유형은 분명히 중복 인 경우). 이 경우에는 일어나고, 당신은 결과에 의해 놀라지 무엇을 숨 깁니다.

File.ReadLines 방법은 당신이 그것을에서 항목을 얻을 때 라인을 읽고하는 열거자를 반환 모든 행을 읽고 컬렉션을 반환하지 않습니다. 이 방법은 반환하지 않기 때문에, 이것은 컴파일러 오류를 제공

string[] URLs = File.ReadLines(Path.GetFullPath(@"Resources\FeedList.txt")); 

: 그것은 반환 유형은 변수의 유형을 지정했다면 당신은 눈치 챘을 것 인 IEnumerable<string>, 문자열 배열이 아니라 배열, 그래서 당신은 결과가 당신이 예상 한 것이 아니었을 것입니다.

열거 자에서 Count() 메서드를 사용하면 해당 열의 수를 계산하기 위해 파일의 모든 줄을 읽습니다. 나중에 열거를 다시 사용하려고하면 이미 모든 줄을 읽고 닫았습니다. TextReader.

대신 열거를 얻는 파일의 모든 라인을 읽을 File.ReadAllLines 방법을 사용

string[] URLs = File.ReadAllLines(Path.GetFullPath(@"Resources\FeedList.txt")); 

이제 배열을 여러 번 사용할 수 있습니다.

+0

감사합니다. 교훈을 배우고 필요한 경우에만 "var"키워드를 사용하십시오. –

관련 문제