2010-06-21 7 views
2

클라이언트가 일부 데이터를 수동으로 업데이트하는 데 사용하는 작은 앱이 있습니다. 매우 기본입니다. 로드 할 때 사용자가 선택할 수있는 회사 목록을 채우고 단추를 클릭하여 다른 시스템의 데이터를 업데이트합니다. 클라이언트는 명령 줄에서이 동일한 기능을 실행할 수 있기를 원하므로 백그라운드 작업자를 추가했습니다. 앱이 실행되면 특정 arg를 확인하고 발견되면 작업자를 시작합니다. 작업자가 완료되면 Close()를 호출합니다.Winform 앱이 닫히지 않습니다

이 모든 것이 제대로 작동하는 것으로 보입니다 (예상대로 데이터가 업데이트되고 앱이 닫힌 것처럼 보입니다).하지만 작업 관리자를 확인할 때 앱이 계속 실행 중입니다.

내 질문 :

  1. 어떤 것은/일이 여전히 실행중인 응용 프로그램의 원인을 찾을 수 찾고되어야 하는가?
  2. 더 좋은 방법이 있나요?

다음은 코드의 샘플입니다 :

public MainForm() 
     { 
      InitializeComponent(); 

      var args = Environment.GetCommandLineArgs(); 
      Array.ForEach(args, x => x.ToLower()); 

      if (args.Contains("u")) 
       backgroundWorker.RunWorkerAsync(); 

     } 
private void BackgroundWorkerDoWork(object sender, System.ComponentModel.DoWorkEventArgs e) 
     { 
      //call to web service to update data 
     } 

private void BackgroundWorkerRunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) 
     { 
      Close(); 
     } 
+0

Program.cs 파일의 코드는 무엇입니까? –

+0

Program.cs의 코드가 기본값입니다. 나는 그것을 수정하지 않았다. – Chuck

+1

Program.cs의 Application.Run()이 종료되지 않았다고 가정합니다. 그렇다면 뭔가가 실행중인 스레드에 메시지 펌프를 보관하고 있습니다. –

답변

3

2) 더 좋은 방법이 있습니까?

콘솔 응용 프로그램에서 코드를 실행할 수 있으며 WinForms/Threading 문제가 없는지 확인하십시오.

변형 된 방법으로 Main()에서 직접 명령 줄을 확인하고 Application.Run (mainForm)을 실행하지 않을 수도 있습니다.

+0

지금 리팩토링하고 있습니다. 나는 1 분 안에 끝내야한다. – Chuck

+0

나는이 솔루션을 내가 한 일보다 훨씬 좋아한다! 고맙습니다! – Chuck

0

보다는 close()를 호출하면, Application.Exit를 호출하려고(). 이렇게하면 양식을 닫는 대신 응용 프로그램이 종료됩니다.

+0

그것을 시도했다. 앱이 작업 관리자에 계속 표시됩니다. – Chuck

0

배경 작업자가 UI 스레드가 아닌 다른 스레드에 있습니다.

UI 스레드에서 물건 처리를위한 대리인을 만듭니다 (이 경우 중지). Example here

+1

전적으로 맞지 않습니다. BackgroundWorker 이벤트는 UI 스레드로 마샬링됩니다. Close()는 BackgroundWorker 이벤트의 양식입니다. –

+0

흠, 지금 당신의 언급 .. –

관련 문제