2012-04-13 2 views
0

У меня вопрос о таймере в потоке?ThreadPool и Threading.Timer?

Мой код:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Testing testing = new Testing();   
     Thread thread = new Thread(new ThreadStart(delegate 
     { 
      testing.Start();    
     })); 
     thread.IsBackground = true; 
     thread.Start(); 
    } 


} 

public class Testing 
{ 
    System.Threading.Timer timer = null; 

    public void Start() 
    { 
     if (timer == null) 
      timer = new System.Threading.Timer(timerTick, null, 500, 500); 
     List<ManualResetEvent> amanual = new List<ManualResetEvent>(); 
     for (int index = 0; index < 10; index++) 
     { 
      ManualResetEvent manual = new ManualResetEvent(false); 
      ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object context) 
       { 
        this.RunningThreadPool(context); 
        manual.Set(); 
       } 
       )); 
      amanual.Add(manual); 
     } 

     WaitHandle.WaitAll(amanual.ToArray()); 
     Console.WriteLine("Task complete"); 
    } 
    void timerTick(object sender) 
    {    
     Console.WriteLine("Timer running"); 
    } 

    public void RunningThreadPool(object context) 
    {    
     Console.WriteLine("Thread in Threadpool is running...");   
    } 
} 

}

И это результат Нить в Threadpool работает ... Нить в Threadpool работает ... Нить в Threadpool работает ... Тема в Threadpool работает ... Тема в Threadpool работает ... Тема в Threadpool работает ... Тема в Threadpool работает ... Тема в Threadpool работает ... Нить в Threadpool работает ... Нить в Threadpool работает ... Задача завершена Таймер работает Таймер работает Таймер работает Таймер работает

У меня есть вопрос о том, как сделать запуск таймера до выполнения пула потоков. За исключением установленного таймера в threadpool. Потому что мне нужно, чтобы таймеры проверяли потоки в threadpool.

ответ

0

Я бы сказал, что 500 мс достаточно, чтобы завершить рабочую очередь, прежде чем таймер даже срабатывает один раз. 10 Console.WriteLine звонков не составляет большой работы.

Предполагая, что вы используете несколько тяжелее нагрузку:

Таймер запускает свой обратный вызов в ThreadPool, так это в очереди после того, как другая работа в очереди ... т.е. это последнее в очереди. Поскольку вы ставите в очередь больше элементов, чем есть потоки в ThreadPool, и ThreadPool только закручивает новые потоки при длительной нагрузке, ThreadPool не может выполнить обратный вызов таймера своевременно.

+0

Но я не поставил таймер в ThreadPool. Любое решение для этого, @spender? –

+0

@ HùngLêXuân Нет, но таймер ставит в очередь обратный вызов в ThreadPool. Прочитайте вторую марку в разделе Замечания по адресу http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx –

+0

Вот почему запуск тяжелых рабочих нагрузок в ThreadPool и подавление работы с ними проблематично. Многие API-интерфейсы .Net полагаются на оставшуюся жидкость ThreadPool, и это может привести к неожиданным задержкам в вашем приложении. Попробуйте выполнить работу в своих потоках. – spender

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