0

我对线程中的计时器有疑问?

我的代码:

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...");           
    }
}

}

这是结果线程池中的线程正在运行...线程池中的线程正在运行...线程池中的线程正在运行...线程池中的线程正在运行...线程池中的线程正在运行...线程池中的线程正在运行。 .. 线程池中的线程正在运行... 线程池中的线程正在运行... 线程池中的线程正在运行... 线程池中的线程正在运行... 任务完成 定时器运行 定时器运行 定时器运行 定时器运行

我有一个问题,定时器如何在线程池执行之前运行。除了在线程池上设置计时器。因为我需要线程池上的计时器检查线程。

4

1 回答 1

0

我想说 500 毫秒是足够的时间来完成你的工作队列,甚至在 Timer 触发一次之前。10个Console.WriteLine电话并不意味着太多的工作。

假设您正在运行较重的工作负载:

Timer 在 ThreadPool 中运行它的回调,所以它在其他工作已经排队之后排队......即它在队列中的最后一个。因为您排队的项目多于 ThreadPool 中的线程数,并且 ThreadPool 仅在长时间负载下启动新线程,所以 ThreadPool 无法及时执行 Timer 的回调。

于 2012-04-13T02:01:12.760 回答