2013-05-31 2 views
0

저는 JSON API를 사용하는 Windows Store 앱을 작성하고 있습니다. API 공급자는 초당 1 회의 api 요청이 이루어 지도록 요청합니다.1 초에 한 번만 작업을 수행하는 가장 좋은 방법은 무엇입니까?

그래서 나는 나를 블록 큐에 요청을 대기 할 수 있도록 해주는 클래스를 생성하고, 백그라운드 스레드에 다음과 유사한 루프 실행됩니다 :

Loop 
{ 
// this will block until a request is added to the queue 
MyRequest = Queue.Take() 

// Create task to make the api request here. 

Thread.Sleep(1000) 
} 

이 방법은에서 기다릴 것을 다른 요청을 Dequeue하기 전에 적어도 1 초.

나는 Thread.Sleep을 Windows 스토어 앱에서 사용할 수 없다는 것을 발견했습니다. Task.Delay()는 불필요하게 낭비되는 것 같습니다. 호출 될 때마다 새로운 작업을 생성하기 때문입니다.

내가 알고있는이 일을하는 알려진 방법이있는 것처럼 느껴지나요?

감사합니다,

+0

작업은 .NET 4.5/Core에서 매우 가볍습니다. –

답변

3

나는 Task.Delay()가 낭비 보인다 알고 있지만 TGH가를 야기 제안처럼 .sleep을() 또는 무한 루프를 사용 MSDN here

에서 Microsoft 직원 및 운영자에 의해 권장 기다리는 동안 프로그램이 응답하지 않게됩니다. 당신이 당신의 큐를 처리하는 동안이 반응하길 원한다면, 당신은 이런 식으로 뭔가를 사용하십시오 : 당신이 작업이 백그라운드에서 실행하려면

await Task.Delay(1000);

0

, 나는 System.Threading.Timer을 건의 할 것입니다. 주기적인 타이머 대신 원샷으로 설정하고 요청할 때마다 새로 고칩니다. 예 :

System.Threading.Timer myTimer; 

// initialize timer 
myTimer = new Timer(TimerProc, null, 1000, Timeout.Infinite); 

void TimerProc(object state) 
{ 
    // do request here 
    // then reset the timer 
    myTimer.Change(1000, Timeout.Infinite); 
} 

이렇게하면 요청이 끝나고 다음 요청이 시작될 때까지 1 초를 기다리는 효과가 있습니다.

틱을 1 초 간격으로 실행하려면 틱을 겹치지 않도록해야합니다. Monitor로 충분히 쉽습니다. 당신은 잠금 개체를해야하고 타이머주기적인 타이머를 만들기 위해 :

object timerLock = new object(); 

// initialize periodic timer 
myTimer = new Timer(TimerProc, null, 1000, 1000); 

그리고 당신의 타이머 PROC : 나는 finallyMonitor.Exit을하지

void TimerProc(object state) 
{ 
    if (!Monitor.TryEnter(timerLock)) 
    { 
     // a request is currently being processed 
     return; 
    } 
    try 
    { 
     // do request here 
    } 
    catch (expected exceptions) 
    { 
    } 
    Monitor.Exit(timerLock); 
} 

참고. 그 이유는 Eric Lippert의 Locks and exceptions do not mix을 참조하십시오.

관련 문제