2011-11-21 4 views
7

자, 여기에 기본 배경이 있습니다. 이 프로그램은 Outlook/Exchange에 연결하고 모든 메일 메시지를 분석하여 암호화 된 것을 확인합니다. 내가하고 싶은 일 중 하나는 멀티 스레딩을 사용하여 메시지를 스캔하는 데 걸리는 시간을 줄이는 것입니다.foreach 루프를 Parallel.ForEach 루프로 변경

foreach (Object item in folder.Items) { 
//Checks for encryption and gets needed info and updates count 
} 

내가 대신 Parallel.ForEach 기능을 활용하는 싶습니다

는 현재 코드는 다음과 같습니다. 나는 그것을 어떻게 설정할 수 있는지 궁금했다. 표현식을 지금 설정하는 방법을 시도했지만 객체 유형이 변수로 사용되었다는 오류가 발생합니다. 어떤 도움이라도 대단히 감사하겠습니다.

좋아요, 내가 준 레이아웃은 옳은 것 같습니다. 코드는 현재 다음과 같습니다

Error 15 The type arguments for method System.Threading.Tasks.Parallel.ForEach(System.Collections.Concurrent.OrderablePartitioner, System.Action)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

어떤 아이디어 :

Parallel.ForEach(folder.Items, item => 
{ 
//does stuff 
}); 

내가 지금 다음과 같은 오류는 무엇입니까? 도움 주셔서 감사합니다.

그래,이 사이트를 발견 : http://blogs.msdn.com/b/pfxteam/archive/2010/03/02/9971804.aspx 그리고 나에게 오류가 필요한 대답을 주었다. 캐스팅 기능을 사용하여 컬렉션을 일반적인 것으로 변경해야했습니다.

static IEnumerable<object> Cast(IEnumerable source) 
{ 
    foreach (object o in source) 
     yield return o; 
} 

그리고는 오류없이 실행 이제

Parallel.ForEach(Cast(folder.Items), item => 
{ 
//does stuff 
}); 

에 원본을 조정할. 만세. 이 같은

+2

수정 된 코드 (오류 메시지를주는 코드)를 게시하십시오. –

+0

편집 후 : 이제 folder.Items 및/또는 // stuff stuff에 의존합니다. –

답변

7

뭔가 :

Parallel.For(0, folder.Items.Count - 1, delegate(int i) { 
    object item = folder.Items[i]; 
}); 

또는를 ForEach와 :

Parallel.ForEach(folder.Items, item => {whatever you want to do with item}) 

참고 : folder.Items이 올바른지 가정을 IEnumerable

+1

+1 또한 IEnumerable을 구현해야한다는 요구 사항을 언급합니다. –

+1

@ iterj : 'for (item in item) ...'다음에옵니다. –

4

를 구현해야합니다

foreach (Object item in folder.Items) 
    Process(item); 

번째 그것으로 변경됩니다

Parallel.ForEach (folder.Items, item => Process(item)); 
관련 문제