2013-09-27 2 views
0

에 실패했습니다. "대기"는 양식의 새로 고침을 막아주는 것으로 보입니다. 아마도 아직 방법에 있기 때문입니다.호출은이 코드를 가지고 작업

어떻게 해결할 수 있습니까?

고마워요.

+0

이 WPF 응용 프로그램입니까? – Alden

+0

WinForm 응용 프로그램입니다. – Baptiste

답변

1

스스로 죽었습니다.

작업이 실행 중일 때 주 스레드에서 호출하려고합니다. 작업이 ... 당신이 사용하는 어떤 경우

를 (가 준비 될 때까지 task.Wait()를 차단합니다) 완료 될 때까지하지만 mainthread 기다리고 있습니다 :

await task; 

이 코드를 사용하는 방법해야 비동기로 표시됩니다. 컴파일러는 메소드를 조각으로 자르고 기다리는 동안 messageloop/thread가 다시 실행됩니다. 작업이 준비되면 나머지 메서드가 실행됩니다. await vs Task.Wait - Deadlock?

1

이 교착 상태입니다 자세한 정보를 원하시면 여기를


봐;합니다 (await를 작업 아래). UI 스레드가 task.Wait() 행에서 차단되어 작업이 완료 될 때까지 대기합니다. 진행률 표시 줄을 업데이트하려면 UI 스레드에 알려야하기 때문에 작업은 Invoke에서 차단됩니다.

아니요은 UI 스레드에서 완료 될 때까지 기다려야하며 task.Wait()을 제거해야합니다. 작업이 완료되자 마자 UI가 업데이트됩니다.

당신이 호출 액션 내부에 가야한다 아래 task.Wait() 넣어 가고 있었다 코드 :

var task = System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    // do task work 

    Invoke(new Action(() => { 
     progressBar.Increment(1); 
     // other code that needs the task to be finished should go here 
    })); 
}); 

// don't call task.Wait() here