2013-04-06 2 views
0

스레드/백그라운드 프로세스에서 머리를 감싸는 데 최악의 시간을 보내고 있습니다. 내 문제는 어느 정도 공통점이 있지만 내 요구를 충족시키는 좋은 예를 아직 찾지 못했습니다.Process.Start in BackgroundWorker C#

고전적인 예는 다음과 같습니다.
특정 장기 실행 작업/프로세스가 실행될 때 UI가 정지됩니다. - 적어도 UI를 이동/최소화 할 수 있어야합니다.

클래식 응답에는 스레딩 및 작업 팩터 리 및 BackgroundWorker 솔루션이 포함됩니다. 하지만 구현 방법에 관계없이 결과가 좋지 않습니다.

내 프로그램에서 다른 응용 프로그램을 실행하고 끝내기를 기다리고 있습니다. 간단하게하기 위해이하지 말라의 내가 지금처럼하고 있어요 말 : WaitForExit() 날 메모장을 닫습니다 기다리고 멀리 갈기 동안

  Process p = Process.Start("notepad.exe somefile.txt"); 
      p.WaitForExit(); 
      //read somefile.txt 

은 분명히 내 응용 프로그램의 UI가 놀았어요.

나는이 주위에 제안 수단의 번호를 시도했지만 내가 두 코너 중 하나에 그린 얻을 : 나는 메모장을 닫을 때

내 인터페이스는 여전히 중단
  1. , 다음 somefile.txt 잘 읽습니다.
  2. 을 맡은 프로세스 (메모장) 잘 실행하지만 내 응용 프로그램은 somefile.txt 바로 내가 메모장 (그래서 내가 비동기 실행의 생각) 나는 높은 번호 - 간단한에 계산 관련 참조

대부분의 예를하지만 폐쇄하기 전에 읽어 내가하는 일이 아니야. 이 "외부"프로세스를 해고하면 다소 복잡해집니다.

시간 내 주셔서 감사드립니다.

+1

:

var worker = new BackgroundWorker(); worker.WorkerReportsProgress = false; worker.WorkerSupportsCancellation = false; worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; worker.RunWorkerAsync(); 

는 그런 다음 핸들러가 UI 스레드가 아닙니다. –

+0

코드의 나머지 부분을 보여 주거나, 메모장을 시작할 최소한의 프로그램을 보여주고, 배경 작업자를 사용하고, 여전히 멈춰 있어야합니다. –

+0

* BackgroundWorker *를 사용하고 worker의 * AfterCompleted * 처리기에서 somefile.txt를 읽으려고 했습니까? –

답변

0

응용 프로그램에서 실행중인 응용 프로그램의 소리가 다른 스레드에서 Process.WaitForExit 호출을 실행하지 않으면 다른 소리가 들리지 않습니다.

BackgroundWorker, ThreadThreadPool 모든 유용한 도구입니다,하지만 그들은 직접 수행해야하는 대부분의 작업, System.Threading.Task와 작업 병렬 라이브러리 다소 스레드를 사용하여 "대체"했습니다 작동하고 제대로하기 어렵고 번거로울 수 있습니다 비동기식으로

은 참조 :

그래서 코드가된다 Threads and the new Task library in C#.

Task.Factory.StartNew(() => 
{ 
    var proc = new Process("..."); 
    proc.WaitForExit(); 
    File.Read("..."); 
}); 
+0

나가 이것을 시도 할 수있는 경우에 감사하십시오 Clint에게 시키십시오. 이 경우 File.Read를 Task Factory 코드 외부에 배치 할 수 있습니까? - 내 예제는 아주 간단 해. –

+0

그럼 ..이게 나를 코너 2로 그렸습니다. 내 프로세스가 훌륭하게 실행되었지만,이 작업을 수행 한 후에 코드가 즉시 실행되었습니다. 미안 해요. BTW 나는 당신을 잃어 버렸다고 생각한다.); 마지막 줄에. –

+1

'System.Threading.Task' 네임 스페이스는 놀랍습니다. 레코드의 경우 이전 버전의 .net 프레임 워크에서는 사용할 수 없습니다 (4.0 버전에서 나타남). –

1

BackgroundWorker가 여기에 적합합니다. 그 라인을 따라 뭔가를 구성해야합니다 : 당신이 다음 UI가 다른 스레드에서 기다리고 있기 때문에 중지하지 않습니다 백그라운드 스레드에서이 작업을 수행하는 경우

void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    //start notepad process here. 
} 

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    //read somefile.txt here. 
} 
+0

그럼, 어떻게해야합니까 (예를 들어) worker_DoWork 메소드에 파일 이름을 전달할 수 있습니까? _ 여기서는 저의 경험이 부족합니다. –

+0

당신은 여전히'worker_DoWork' 핸들러에'p.WaitForExit()'를 원할 것입니다. –

+0

또한 ... worker.RunWorkerAsync(); 코드가 있다고 가정 해 봅시다. 그 텍스트 파일의 내용으로 뭔가를 했어. 내 코드에서 그것은 그냥 업데이 트되지 않은 경우에도 계속해서 계속 –