2013-07-02 3 views
1

글쎄, 내가 사용하고 궁금 해서요 Task.Delay Application.DoEvents를 사용하는 것이 더 낫습니다?Application.DoEvents 대신 Task.Delay 사용

샘플 코드 :

private async void NonBlockingWaitAwhile(int milliseconds) 
{ 
    Stopwatch sWatch = Stopwatch.StartNew(); 

    while (sWatch.Elapsed.Milliseconds <= milliseconds) 
    { 
     await Task.Delay(50); 
    } 
} 

또는

private void WaitAwhile(int milliseconds) 
{ 
    Stopwatch sWatch = Stopwatch.StartNew(); 

    while (sWatch.Elapsed.Milliseconds <= milliseconds) 
    { 
     Application.DoEvents(); 
    } 
} 

그래서 방법은 i'v가 모든 보류중인 이벤트을 발표하기 때문에 Application.DoEvents를 사용하여 오류가 발생할 수 있음을 들었다고 특별히 (더 낫다 응용 프로그램에 포함될 수 있음)

+2

위 항목 중 하나가 아닙니다. 타이머를 사용하십시오. 그리고 작동하지 않는 Visible 속성을 수정하지 마십시오. Opacity 속성을 디자이너에서 0으로 설정하고 Tick 이벤트 처리기에서 0.99로 변경합니다. 1.0이 아닙니다. –

+0

지금까지의 답변은 (1) 실제 문제를 수정했습니다. (2) 결코 바쁘지 않습니다. (3) DoEvents는 비동기를 달성하는 좋은 방법이 아닙니다. DoEvents 스타일의 프로그래밍에 대한 더 긴 비판에 대해서는 적절한 비동기 대 MSDN Magazine의 주제에 대한 필자의 기사를 참조하십시오. http://msdn.microsoft.com/en-us/magazine/hh456401.aspx –

답변

5

Task.Delay은 재 입력을 피하기 때문에 DoEvents보다 좋습니다.

그러나 가장 좋은 해결책은 둘 중 하나를 사용하지 않는 것입니다. 지연에는 몇 가지 유효한 용도 만 있습니다 (예 : 조절 재시도). 거의 지연된 시간이 많이 있습니다 (예 : 올바른 접근 방식이 실제 문제를 해결하는 경우 인코더가 경쟁 조건을 피하거나 어색한 아키텍처를 해결하기 위해이 코드를 사용하고 있습니다.)

+0

그래서 기다리고 싶다면 어떻게해야합니까? 동안 어떤 장소에서 메인 스레드를 차단하지 않고. –

+0

그러나 * 왜 * 이것을하고 싶습니까? –

+0

응용 프로그램이 시작될 때 폼이 안정되기 전에 1 초 동안 깜박 거립니다. 그래서 Visible을 false로 설정 한 다음 2 초 동안 기다린 다음 visible = true를 다시 설정하십시오. 따라서 사용자는 깜박임을 경험하지 않았습니다. –

2

Application.DoEvents는 실제로 지연을 생성하지 않습니다. 주 응용 프로그램 UI 스레드가 대기중인 모든 Windows 메시지를 처리하도록합니다. 처리 할 부분이 많지 않으면 매우 빠르게 반환됩니다.

관련 문제