2013-10-01 2 views
0

웹 사이트의 상품 상태를 확인하는 프로그램이 있습니다.다중 system.threading.timer의 초기화가 느림

이전에는 스레딩을 배워야 했으므로 단순히 프로그램에서 system.threading.timer를 사용합니다.

나는 10 개 계정의 계정 목록과 물품을 구입하는이 System.Threading.Timer의 목록 및

List<system.threading.timer> _timerList; 
System.threading.timer _timerA; 
System.threading.timer _timerB; 
System.threading.timer _timerC; 
가 나는 제품 상태를 확인 _timerA라고 몇이 System.Threading.Timer 및 전화 _timerList이 상품이 올라 갔을 때.

500 ms마다 _timerA를 실행합니다.

_timerA = new System.Threading.Timer(new TimerCallback(submit_checkgoods), 0, 0, 500); 

내부 submit_checkgoods (_timerList.Add (...)는 이전이라고합니다) :

if (goodsIsUp == true) 
{ 
    for (int k = 0; k < infolistbb.Count; k++) 
    { 
     int copy = k; 
     _timerList[copy] = new System.Threading.Timer(new TimerCallback(submit_buygoods), copy, 0, 0); 
    } 
} 

문제는 내가 실행 _timerlist [복사]를 호출하면 매우 느린 것을 발견 할 것입니다.

나는 스톱워치를 사용하여 _timerlist를 호출하여 submit_buygoods의 끝까지 실행하고 submit_buygoods를 실행 한 시간을 확인했습니다.

submit_buygoods는 매우 빠르지 만 호출 프로세스는 하나씩 비슷합니다.

_timerList [0]이 (가) submit_buygoods의 실행을 완료하면 _timerList [1]가 실행됩니다.

스레드가 너무 많으면 (실제로는 약 15 개) System.threading.timer의 결함입니까?

이유는 무엇입니까? 어떤 구제 수단? Thread t = new Thread()로 전환하면 도움이됩니까?

+1

타이머 콜백은 스레드 풀 스레드에서 실행됩니다. 스레드 풀 관리자는 실행중인 TP 스레드 수를 시스템에서 사용 가능한 코어 수로 제한하려고 시도합니다. 현명한 전략. –

+0

Task.Factory.StartNew에 대해 검색했습니다. 또한 ThreadPool에서 예약되며 StartNew는 별도의 스레드를 보장하지 않습니다. 나는 스레딩에 대해 잘 이해하지 못한다. 그들이 개별적으로 즉시 실행되기를 원한다면 어떤 종류의 스레딩을 사용해야합니까? –

+0

타이머를 잘못 사용하고있는 것처럼 보입니다. 타이머를 사용하면 무언가를 주기적으로 수행 할 수 있습니다. 타이머를 "호출"하지 마십시오. 질문을 변경하여 원하는 것을 설명하고 해결책을 제안하십시오. 단지 문제를 혼동시키기 때문에 작동 할 수있는 부분을 추측하지 마십시오. –

답변

3

스레드 대신 태스크를 사용하면 짧은 작업에 더 좋습니다.

Task.Factory.StartNew(submit_buygoods); 

P. 어쩌면 500ms마다 서버를 망치면 안됩니다. IP를 금지시킬 수 있습니다.

+0

나는 곧 시험해보고, 여기에 감사 할 것이다! –

+0

나는 똑같은 일을 시도했다. 하지만 thread = new thread()가 작동합니다. 어쨌든 도와 줘서 고마워 !! –

관련 문제