2010-02-28 3 views
0
private void ParallelCrashTest() 
{ 

    for (int x = 0;x < 100; x++) 
    { 
     Dowork_1(i); 
    } 
} 

private void Dowork_1(int i) 
{ 
ThreadInfo threadInfo = new ThreadInfo(); 
threadInfo.first = 0; 
threadInfo.last = 100; 
for (int x = 0;x < 60; x++) 
    { 
     Dowork_2(threadinfo); 
     progressBar2.Value = x + 1; 
    } 
} 
private void Dowork_2(object param) 
{ 

    ThreadInfo threadInfo = param as ThreadInfo; 
    int first = threadInfo.first; 
    int last = threadInfo.last; 
    Parallel.For(first, last, i => 
    { 

     didsomthing... 

    } 

    Update(); 

} 

그래서 작동하지 않습니다. (CPU가 90-100 % 작동한다는 것은 내 앱이 작동하는 것 같음) Application.DoEvent() 대신 Update()를 사용했습니다. 내 응용 프로그램이 충돌하거나 Update() 할 수 없습니다. 나는 모른다. 그게 문제가 될 수 Update() 생각하지만 잘 모르겠습니다. 어떤 제안이 있으십니까? 감사합니다.스택 트레이스 VS2010

+2

"didsomthing"이란 무엇입니까? 이 문제를 일으키는 원인이 무엇이든지간에 거기에 있다고 내가 말할 것입니다. 아마도 GUI를 업데이트하려고합니다. – Aaronaught

+2

@ fail 트롤이 실패했습니다. 나는 예외 사항이 전혀없는 "MY APP CRASHED HURR"질문도 좋아합니다. 우리가 마술 지팡이를 물결 치고 무언가가 추락 한 이유를 알 수있는 것처럼 말입니다. 또한, 다중 스레드 응용 프로그램의 Application.DoEvents? 가이는 멋진 책에 앉아서 배워야합니다. – Will

+0

@ 윌 : 당신은 마법의 디버깅 지팡이를 가지고 있지 않습니까? 내 최고의 달러를 지불했지만 그만한 가치가있었습니다. 더 이상 성가신 응용 프로그램이 충돌하지 않습니다! – Aaronaught

답변

2

어떤 방식으로 충돌하나요?

내 생각에 진행률 표시 줄을 업데이트하는 등의 다른 스레드에서 GUI를 업데이트하려고합니다. 이렇게하려면 Invoke을 사용해야합니다.

우리가 추측 할 필요가 없도록 오류를 재생산하는 코드를 컴파일하는 간단한 단순하지만 완전한 예제를 제공하면 유용 할 것입니다. 오류를 재생하면서 더 이상 줄을 제거 할 수 없을 때까지 프로젝트를 새 폴더에 복사하고 불필요한 파일, 클래스, 메서드 및 줄을 제거하면됩니다.

+0

실제로 샘플 "For"루프를 사용할 때 괜찮 았지만 시간이 오래 걸립니다. 그래서 나는 시간을 줄여야합니다. 방금 "For"루프 대신 "Parallel.For"를 변경했습니다. 나는 dosomething이 "for"루프를 사용할 때 효과가 있었다고 생각하지 않는다고 생각합니다. – tonyontlga

+0

@tonontlga :'for'를 사용하면 같은 스레드에서 실행됩니다. 'Parallel.For'는 많은 다른 스레드를 사용할 수 있습니다. 귀하의 문제는 당신이 병렬에 대한 GUI를 업데이 트하고 있다고 생각하지만, 그것은 또한 스레드와 관련된 다른 뭔가가 될 수 있습니다. 문제가 무엇인지 확신 할 수있는 충분한 코드를 제공하지 않았습니다. 오류를 재생산하고 게시하는 컴파일 및 실행 가능한 최소 단순화 된 예제를 작성하십시오. –

+0

예 진행률 표시 줄을 사용하고 있습니다. 내 응용 프로그램이 몇 분 동안 작동 중 갑자기 프로그램의 모든 실시간 시간 중 중간에 충돌이 발생했습니다. :) – tonyontlga

1

Update() 메서드 나 progressBar2.Value 할당이 작업자 스레드에서 유효하지 않습니다. VS2010이 아닌 Visual Studio를 크래시하지 않습니다. 간단한 IllegalOperationException을 사용하여 부적절한 일을한다고 말할 수 있습니다.

Control.Invoke() 메서드를 사용해야합니다. 링크 된 MSDN 기사에는 좋은 예가 있습니다.

+0

예, 작업자 스레드를 사용했습니다. 그것은 Workaround 프로세스와 같습니다. 그러나 "paralle.for"루프 안에서는 시간이 오래 걸린다. 그것이 좋지 않은 이유입니다. 나는 시간표를 정리해야 해. – tonyontlga

관련 문제