2013-02-05 4 views
1

실행하고 싶은 작업이 오래 있고 상태/진행 상태를 사용자 인터페이스에 알릴 수 있다고 해봅시다. 여기 잡기는 내가 원하는 UI가 모달 대화 상자이며, 작업을 시작하기 전에 UI를 표시 할 수 없으며 작업을 시작한 다음 표시 할 수도 있습니다.TPL 모달 대화 상자에서 TPL 작업 진행

시도 1 : 첫 공연 대화 상자가 다음 작업을 시작합니다

분명히 작동하지 않는 스레드가 ShowDialog를에서 차단
ProgressDialog dlg = new ProgressDialog(); 
Task longRunningTask = CreateTask(); 
dlg.ShowDialog(); 
longRunningTask.Start(); 
Task.WaitAll(longRunningTask); 

()를하고, 작업이 시작되지 않습니다.

시도 2 ​​: 시작 작업, 다음 대화 보여

ProgressDialog dlg = new ProgressDialog(); 
Task longRunningTask = CreateTask(); 
longRunningTask.Start(); 
dlg.ShowDialog(); 
Task.WaitAll(longRunningTask); 

을하지만이 시나리오에서 내가 작업, 또는 더 나쁜에서 처음 진행 이벤트 누락 위험이, 나는 "제기 된 공포의 크로스 스레드 예외가 InvokeRequired "는 false를 표시합니다. 첫 번째 이벤트는 생성되는 동안 진행 대화 상자에 도착하지만 아직 표시되었으므로 핸들이 없습니다.

대화 상자에 작업을 전달하고 대화 상자를 시작한다고 가정하지만,이 문제에 대한 우아한 해결책이 필요하지 않은 것처럼 느껴지십니까?

+0

참조 http://stackoverflow.com/questions/3395379/tracking-progress-of-a-multi-step-task –

답변

3

Shown 이벤트는이 문제를 해결하기위한 완벽한 :

ProgressDialog dlg = new ProgressDialog(); 
dlg.Shown += (_, args) => 
{ 
    CreateTask().Start(); 
}; 
dlg.ShowDialog(); 

당신이 작업이 이동하기 전에 완료하고 양식이 완료되기 전에, 당신이 수정할 수 폐쇄 될 수 있도록해야하는 경우 작업이 생성되기 전에 여기 두 경우 모두 대화 형태가 만들어집니다

ProgressDialog dlg = new ProgressDialog(); 
Task longRunningTask = CreateTask(); 
dlg.Shown += (_, args) => 
{ 
    longRunningTask.Start(); 
}; 
dlg.ShowDialog(); 
longRunningTask.Wait(); 

주를, 그래서 t의 인스턴스에 액세스 할 수 있도록하는 경우는 CreateTaskdlg 인스턴스를 전달할 수 있습니다과 같이 작업에서 대기 그는 형성된다.

+0

완벽한, 감사합니다. –