2012-06-25 7 views
0

주기적으로 10 초 실행되는 작업이 있습니다. 필자는 데이터베이스를 읽음으로써 프로세스를 리프레시하는 그림 상자를 만들었습니다. 내가 원하는 것은 스레드를 호출하거나 깨우고 단추를 즉시 클릭 할 때 새로 고침 작업을 수행하는 것입니다. 간단히 말해서, 나는 새로 고침 작업이 시간뿐만 아니라 이벤트에 의해 주도되기를 원합니다. 이것이 가능한가? 그렇다면 어떻게? 작업의 코드 블록은 아래와 같습니다.자고있는 동안 잠을 자다

while (true) 
{ 
    // do some refresh operation 
    Thread.Sleep(10000); 
} 

void button1_Click(object sender, EventArgs e) 
{ 
    // invoke or awaken thread 
} 
+0

하지이 while 루프와 - 기본적으로 Thread.Sleep 당신은 창문을 말하는거야 - 다음 10 초 안에 그 스레드를 예약하지 마라. 나는 그것을 되 찾을 수있는 방법을 모른다. 시간 간격을 줄이고 루프 내부의 변수를 검사 할 수 있습니다. – Bond

+0

타이머 컨트롤을 사용하십시오! 그것을 위해 만들어졌습니다. 틱 이벤트가 UI 스레드 내에서 발생하므로 멀티 스레딩 작업을 수행하지 않아도됩니다. –

+0

내가 이해하지 못하는 것은 다음과 같습니다. 타이머가 GUI를 업데이트했다고 가정하고 5 초 후에 다른 수동 업데이트 버튼을 클릭합니다. 타이머가 5 초 후 자체 업데이트를 실행해야합니까, 아니면 다음 턴까지 멈추어야합니까? – Tudor

답변

4

먼저 떨어져 나가 타이밍에 의한 작업의 Thread + Sleep + Invoke 콤보 드롭 조언을 것입니다. 그것은 매우 추합니다. 이 세 가지 작업을 자동으로 수행하는 WinForms 및 WPF 용 타이머 클래스가 있습니다 (디스패처 스레드에서 GUI를 정기적으로 업데이트). System.Windows.Forms.TimerSystem.Windows.Threading.DispatcherTimer을 확인하십시오.

이제 특정 질문에 대해 GUI를 필요한대로 업데이트하고 타이머 코드와 버튼 처리기에서 모두 호출하는 일반적인 방법을 정의 할 수 있습니다.

0

하여 만드는 AutoResetEvent :

protected AutoResetEvent _threadCycle; 
_threadCycle = new AutoResetEvent(false); 

당신이 기다리고 싶지 :

_threadCycle.Set(); 
:

_threadCycle.WaitOne(delay, false); 

을 당신은 효과적으로 계속 스레드를시키는 이벤트를 설정하려는 경우

보너스 :

_threadCycle.WaitOne(delay, false);을 실행하면 true 또는 false이라는 반환 값이 반환되므로 시간 초과가 만료되었는지 또는 수동으로 설정된 이벤트로 인해 계속되는지 확인할 수 있습니다.

BTW : 당신이 다른 스레드에서 작업을 수행하는 경우에만 작동합니다

. 메인 쓰레드를 사용한다면, 어쨌든 타임 아웃 완료를 기다리면서 멈추게됩니다. 어쩌면 @Tudors 대답을 사용하는 것이 가장 좋을 것이며이 옵션은 '가시를 통과하는'방법으로 만 얻을 수 있습니다.

0

이렇게하려면 AutoResetEvent를 사용해야합니다.

은 같은 (당신의 AutoResetEvent 가정은 '신호'라고합니다) 당신이 할 것은 :

while (true) 
{ 
    signal.WaitOne(10000); 
    ... 
} 

그리고 단추 처리기에서

바로 수행

signal.Set(); 
관련 문제