2009-03-30 5 views
4

C# 응용 프로그램이 시스템 시작시 실행 중이고 실제로 SQL Server 인스턴스가 수행 될 때까지 기다려야합니다. 지금 당장은 서버가 응답하기를 기다리고 (서비스에서 대기 핸들을 사용했지만 안정적이지는 않음) 애플리케이션의 기본 대화 상자를 시작합니다.유휴/대기 대화 상자가 있습니까?

물론 문제는 서비스가 시작될 때까지 그리고 사용자가 사용하는 하드웨어로 인해 최대 1 분이 소요될 수 있다는 것을 사용자가 알 수 없다는 것입니다. 그래서 어떤 종류의 "Loading/Please Wait"표시기를 던지려고합니다. 문제는 프로젝트가 잠김 상태에 가까워지고 새로운 클래스를 만드는 것만큼이나 큰 변화는 많은 두통을 일으킬 것입니다. 기존 파일 (Program.cs와 같은)을 수정하는 것은 새로운 파일을 만드는 것보다 훨씬 덜 방해적입니다. 긴 이야기 짧게 : SQL Server에서 시작하기 전에 (비동기 적으로, 비동기로) 표시되기에 적합한 .NET 클래스가 있습니까? 그러면 응답하기 시작할 때 제거됩니까?

답변

5

트릭을 수행 할 수 있도록 함께 해킹 한 트리플 스레드 버전입니다. 이것은 눈에 보이는 형태로 어디에서나 드롭 될 수 있으며 (또는 program.cs에 대해 수정 될 수 있음) 부모 스레드의 FinishedProcessing이 설정 될 때까지 사용자주의를 지배하는 매끄러운 스크롤 진행 막대가있는 새롭고 가운데에 위치한 모달 대화 상자를 생성합니다 사실로.

 //Update to true when finished loading or processing 
     bool FinishedProcessing = false; 

     System.Threading.AutoResetEvent DialogLoadedFlag 
      = new System.Threading.AutoResetEvent(false); 


     (new System.Threading.Thread(()=> { 

      Form StockWaitForm = new Form() 
      { Name = "StockWaitForm", Text = "Please Wait...", ControlBox = false, 
       FormBorderStyle = FormBorderStyle.FixedDialog, StartPosition = FormStartPosition.CenterParent, 
       Width = 240, Height = 80, Enabled = true }; 

      ProgressBar ScrollingBar = new ProgressBar() 
      { Style = ProgressBarStyle.Marquee, Parent = StockWaitForm, 
      Dock = DockStyle.Fill, Enabled = true }; 

      StockWaitForm.Load += new EventHandler((x, y) => 
      { 
       DialogLoadedFlag.Set(); 
       (new System.Threading.Thread(()=> { 
        while (FinishedProcessing == false) Application.DoEvents(); 
        StockWaitForm.Invoke((MethodInvoker)(()=> StockWaitForm.Close())); 
       })).Start(); 

      }); 

      this.Invoke((MethodInvoker)(()=>StockWaitForm.ShowDialog(this))); 


     })).Start(); 

     while (DialogLoadedFlag.WaitOne(100,true) == false) Application.DoEvents();  
     // 
     //Example Usage 
     //Faux Work - Have your local SQL server instance load here 
     for (int x = 0; x < 1000000; x++) int y = x + 2; 

     FinishedProcessing = true; 

취향에 맞게 사용자 정의하십시오. 또한 이것을 프로덕션 응용 프로그램에서 사용하는 경우 try ... catch 블록에 새 스레드 내용을 포장하여 CYA으로 차단하십시오.

Coderer 공용 라이센스/SO V1.0
나는, 사람이 알려진 "Coderer을"에 다음과 같이 마지막으로 한가지, 나는 "Coderer 공용 라이센스/SO 1.1"에서 당신이 코드를 공개하고있어 커뮤니티 "스택 오버플로"는 실행 단계의 프로젝트에 추가 클래스를 추가 할 수있는 정상적인 프로젝트 관리 방법론으로 전환하는 것을 철저히 고려하는 데 동의합니다. 나치와 같은 변경 통제가 관련된 모든 당사자에게 건강에 좋지 않다는 것을 이해합니다.

+0

우스운 일, 나는 거의 정확하게이 지난 밤에 나 자신으로했다. 나는 당신이 3 개의 스레드가 필요하다고 생각하지 않습니다 - 나는 단지 2 개만을 사용했습니다. 프로젝트 관리에 관해서는, 우리는 실행 단계가 없다는 것입니다. 우리는 영원히 우리의 통제에서 벗어났습니다. 그리고 우리는 거의 거기에 있습니다. – Coderer

+0

winforms 앱 내에서 코드를 정확히 시도했습니다. 하지만 불행히도 "Please wait ..."대화 상자는 사라지지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? – Kai

+0

나는 카이와 같은 문제가 있었다. 메인 UI 스레드에서이 대화 상자를 호출하는 것이'Application.DoEvents()'에서 차단 된 것으로 밝혀졌습니다. 내 메인 UI 스레드에서'FinishedProcessing'을 설정했기 때문에 대화 상자가 닫히지 않았습니다. 이 문제를 해결하기 위해 실제 작업을 수행하는 별도의 스레드를 생성해야했습니다. [gist here] (https://gist.github.com/3702171)를 참조하십시오. – Onisemus

2

다음은 표준 Windows 진행 대화 상자 주위에 .NET 래퍼 :

http://www.codeproject.com/KB/shell/iprogressdialognet.aspx

내가 엉망하지 않은,하지만 난 진행률 표시 줄 스핀을 만들 수있는 플래그있을거야. 정말로 멋진 것을 원한다면, 당신은 심지어 당신 자신의 AVI 애니메이션을 채우고 그것을 꽂을 수 있습니다.

+0

처음에는 피하려고했던 새로운 파일을 추가한다는 것을 제외하고는 훌륭하게 들립니다. 내가 "재고"라고 말한 이유는 소매 용 Win XP 시스템에 소매 용 VS 2005 디스크를 설치하여 얻을 수있는 무엇인가를 원합니다. – Coderer

+0

그럴 경우 실제로 할 수있는 일이 전혀 없습니다. 스톡 대화가 없으므로 새로운 파일을 추가하는 것은 이런 일에 불가피합니다. –

1

"기다려주십시오 ..."대화 상자가 쉽게 만들어지기 때문에 나는 그 이유를 알 수 없습니다.

제 지식은 아니요. 재고가 없습니다. 그것은 당신 자신의 것을 성장시키는 것이 거의 쉽다. 단지 폼을 사용 불가능하게하고, 모래 시계 커서를 불러 올 수있다. 같은 생각이며 구현하기 쉽습니다.

+0

다시 말하지만, 프로젝트 관리를 위해 새로운 클래스 파일을 만드는 것을 피하려고합니다. 하나 또는 두 줄의 코드를 추가 할 수 있다면 할 수 있습니다. 새 파일에 50 줄의 코드를 추가해야한다면 그렇게하지 않을 것입니다. – Coderer

+0

50 줄의 코드가 프로젝트 관리 체계를 망칠 것이라면, 아마도 새로운 것이 필요하다는 신호 일 것입니다. –

0

작업자 스레드에서 BackgroundWorker 내에서 SQL 작업을 수행하는 것이 좋습니다. 그러면 응용 프로그램이 응답 성을 잃지 않게됩니다.

+0

문제는 우리의 초기 대화 상자가 SQL 데이터 바인딩을 사용하기 때문에 "이 다른 스레드가 '서버 응답'플래그를 설정하기 전까지는 이것을 꺼야합니다. 적어도 나는 거기에 있다고 생각하지 않는다. – Coderer

관련 문제