트릭을 수행 할 수 있도록 함께 해킹 한 트리플 스레드 버전입니다. 이것은 눈에 보이는 형태로 어디에서나 드롭 될 수 있으며 (또는 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"에서 당신이 코드를 공개하고있어 커뮤니티 "스택 오버플로"는 실행 단계의 프로젝트에 추가 클래스를 추가 할 수있는 정상적인 프로젝트 관리 방법론으로 전환하는 것을 철저히 고려하는 데 동의합니다. 나치와 같은 변경 통제가 관련된 모든 당사자에게 건강에 좋지 않다는 것을 이해합니다.
우스운 일, 나는 거의 정확하게이 지난 밤에 나 자신으로했다. 나는 당신이 3 개의 스레드가 필요하다고 생각하지 않습니다 - 나는 단지 2 개만을 사용했습니다. 프로젝트 관리에 관해서는, 우리는 실행 단계가 없다는 것입니다. 우리는 영원히 우리의 통제에서 벗어났습니다. 그리고 우리는 거의 거기에 있습니다. – Coderer
winforms 앱 내에서 코드를 정확히 시도했습니다. 하지만 불행히도 "Please wait ..."대화 상자는 사라지지 않습니다. 내가 도대체 뭘 잘못하고있는 겁니까? – Kai
나는 카이와 같은 문제가 있었다. 메인 UI 스레드에서이 대화 상자를 호출하는 것이'Application.DoEvents()'에서 차단 된 것으로 밝혀졌습니다. 내 메인 UI 스레드에서'FinishedProcessing'을 설정했기 때문에 대화 상자가 닫히지 않았습니다. 이 문제를 해결하기 위해 실제 작업을 수행하는 별도의 스레드를 생성해야했습니다. [gist here] (https://gist.github.com/3702171)를 참조하십시오. – Onisemus