2010-01-14 5 views
2

저는 응용 프로그램이 실행되는 한 계속 살아있는 스레드에서 작업 중이며 500ms 간격으로 실행됩니다. 대기열에 처리 할 항목이 없으면 쓸데없이 처리 할 수 ​​있다는 점에 유의하면서 로컬로 가져온 일부 소스를 살펴 보았습니다. 예를 들어 광산에 가까운 예제를 발견했지만 자바에 있습니다. 영원히 계속 while 루프 내부.NET - 스레드 동기화

synchronized(this) { 
    try { 
     wait(); 
    } catch (InterruptedException e) { 
     cleanup(); 
     break; 
    } 
} 

:

이 있었다.

synchronized(this) { 
    notifyAll(); 
} 

이 인큐 스레드 내부이었다

스레드이 대기에 통지한다. 클래스가 Runnable을 상속 받았다는 점에 유의하시기 바랍니다.

누구나 신속하게 C#에서 해당 기능을 설명 할 수 있습니까? 그리고 당신이 할 수 있다면 어쩌면 예를 들어!

+0

대신 스레드 풀을 사용해보십시오. –

답변

5

.NET/C# 우수 사례는 EventWaitHandle을 사용하는 것이 좋습니다.

당신은 몇 가지 변수가 같은 때문에 스레드간에 공유 한 것 : 소비자 스레드 (당신이 지금 모든 500ms 이내 깨어있는 하나)에서

EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.AutoReset); 

, 당신은 루프하려는 대기

try 
{ 
    while(true) 
    { 
     handle.WaitOne(); 
     doSomething(); 
    } 
} 
catch(ThreadAbortException) 
{ 
    cleanup(); 
} 

을 그리고 생산자 스레드 : (아마도 타임 아웃) 처리 어쩌면

produceSomething(); 
handle.Set(); 
1

을 수행 할 수 있습니다 블로킹 큐를 사용하십시오 : http://www.eggheadcafe.com/articles/20060414.asp

리턴 할 오브젝트가있을 때까지 대기열 제거 기능 블록을 제외한 대기열입니다.

사용법 :

BlockingQueue q = new BlockingQueue(); 

    void ProducerThread() 
    { 
    while (!done) 
     { 
     MyData d = GetData(); 
     q.Enqueue(d); 
     Thread.Sleep(100); 
    } 
    } 

    void ConsumerThread() 
    { 
    while (!done) 
     { 
     MyData d = (MyData)q.Dequeue(); 
     process(d); 
     } 
    } 

이 프로세스 큐에 뭔가, 그리고 아무 상관이없는 경우 CPU 시간 폴링을 낭비하지 않을 때 소비자 스레드 만 실행합니다.

0

매 500ms마다 발생하는 타이머를 사용하고 타이머 처리기에서 작업을 수행하십시오. 타이머 처리기 스레드는 스레드 풀에서 실행됩니다. 여기에 대해 읽어보십시오 : http://www.albahari.com/threading/part3.aspx#_Timers.

System.Timers.Timer timer = new System.Timer(500); 
timer.Elapsed += new System.Timers.ElapsedEventHandler (MyTimerHandler); 
timer.Start(); 

private void TimerHandler(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    // optional - stop the timer to prevent overlapping events 
    timer.Stop(); 
    // this is where you do your thing 
    timer.Start(); 
} 
+0

프로세스의 전체 지속 기간 동안 계속 실행되는 타이머의 경우 'System.Threading.Timer'를 사용하면 약간 더 성능이 좋고 효율적인 옵션이됩니다. – STW

+0

@Yooder, 훨씬 더 성능이 좋을지 확실하지 않지만 사용하는 것이 훨씬 쉽습니다. –

+0

참조 된 Alahari 논문에 따르면 "... System.Timers 네임 스페이스는 System.Threading.Timer를 래핑하여 동일한 스레드 풀을 사용하는 동안 추가 편의성을 제공합니다 ...".성능 차이가있는 이유는 무엇입니까? –

0

C#의 스레딩에 대한 Joe Albahari의 무료 전자 서적을 다운로드하고 읽을 수 있습니다. 훌륭한 소개 및 참고 자료입니다.

Threading in C#