2013-10-01 9 views
0

У меня есть программа, которая проверяет состояние товара на сайте.Медленная инициализация нескольких system.threading.timer

Как я раньше не изучал потоки, я просто использую system.threading.timer в своей программе.

У меня есть список system.threading.timer и несколько system.threading.timer

List<system.threading.timer> _timerList; 
System.threading.timer _timerA; 
System.threading.timer _timerB; 
System.threading.timer _timerC; 

я назвал _timerA проверить статус товаров и призвал _timerList купить товар со списком счета 10 счетов когда товар вверх.

Выполняю _timerA за 500 мс.

_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], затем перейдите.

Является ли это недостатком System.threading.timer, когда слишком много потоков (на самом деле около 15)?

В чем причина? Любое средство? Будет ли переключиться на Thread t = new Thread()?

+1

Ответные запросы по таймеру выполняются на резьбовых нитях. Диспетчер threadpool пытается ограничить количество выполняемых потоков TP на количество ядер, доступных в машине. Мудрая стратегия. –

+0

Я искал о Task.Factory.StartNew. Он также запланирован на ThreadPool, и StartNew не гарантирует отдельный поток. Как я плохо разбираюсь в потоках. Можете ли вы дать мне совет, какую резьбу следует использовать, если я хочу, чтобы они выполнялись отдельно и сразу? –

+0

Мне кажется, что вы используете таймеры неправильно. Вы используете таймер, если хотите, чтобы что-то происходило периодически. Вы не вызываете таймер. Измените свой вопрос, чтобы описать, что вы хотите сделать, и предложим решение. Не просто догадывайтесь, что может сработать, потому что вы просто путаете проблему. –

ответ

3

Используйте задачу вместо Thread, они лучше подходят для коротких заданий.

Task.Factory.StartNew(submit_buygoods); 

P.S. Возможно, вы не должны забивать сервер каждые 500 мс, вы можете заблокировать свой IP-адрес.

+0

Я постараюсь очень скоро и сообщить об этом, спасибо! –

+0

Я пробовал, то же самое происходит. Но работает thread = new thread(). В любом случае, спасибо за помощь! –

Смежные вопросы