线程计时器不工作?

时间:2011-08-02 06:53:04

标签: c# multithreading timer

public class DHSApi
{
    public void StartFetchingTickerInfo()
    {

        client = new clientAPI();

        Trace.Write("Timer Started" );
        Timer timer = new Timer(new TimerCallback(GetQuotes), null, 0, 10000);

    }

    public void GetQuotes(object obj)
    {
        Trace.Write("Timer Pass:" + timerPasser++);
        if (currentWork > workList.Count - 1)
            currentWork = 0;
        Thread t = new Thread(Quote);
        t.Start(workList);


    }
    private void Quote(object obj)
    {
        Trace.Write("Entered Quotes:" + quotesIn++);

        lock (workList)
        {
            List<Work> works = new List<Work>();
            int error = 0;

            foreach (Work w in works)
            {

                client.CreateClientAPI();
                //Work Work Work
                client.DestroyClientAPI();
            }
            Trace.Write("Exits Quotes:" + d);
            QuotesReturned(works);
        }

    }
    private void QuotesReturned(List<Work> works)
    {
        Model.PIP pip;
        foreach (Work w in works)
        {

        }
    }
}

计时器基本功能假设在Web服务中运行一段时间......问题是计时器工作一次或两次然后停止我不知道为什么?我找不到原因。这必须是由于线程。当我基于偶数处理程序而不是计时器实现类似的东西时,也存在同样的问题。

Timer StartedTimer Pass:0Entered Flash Quotes:0Exits引用:1线程''(0xb18)已退出,代码为0(0x0)。 定时器传递:1个输出引号:1退出引号:2线程''(0x153c)已退出,代码为0(0x0)。 定时器通过:2个输入引号:2退出引用:3线程''(0xf10)已退出,代码为0(0x0)。 定时器通过:3个输出引号:3退出引用:4线程''(0x1044)已退出,代码为0(0x0)。 定时器通过:4个输出引号:4退出引用:5线程''(0xd24)已退出,代码为0(0x0)。 定时器通过:5个输入引号:5退出引用:6线程''(0x688)已退出,代码为0(0x0)。 定时器通过:6个输入引号:6退出引用:7线程''(0x17c8)已退出,代码为0(0x0)。 定时器通过:7个输出引号:7退出引用:8线程''(0xf34)已退出,代码为0(0x0)。 定时器通过:8个输入引号:8退出引用:9线程''(0x16f4)已退出,代码为0(0x0)。 定时器通过:9个输出引号:9退出引用:10线程''(0xf74)已退出代码0(0x0)。 定时器通过:10个输入引号:10个退出引用:11线程''(0x938)已退出,代码为0(0x0)。 定时器通过:11个输入引号:11退出引用:12线程''(0x1048)已退出,代码为0(0x0)。 定时器通过:12个输入引号:12退出引用:13线程''(0x17dc)已退出,代码为0(0x0)。 定时器通过:13个输入引号:13退出引用:14线程''(0x174c)已退出,代码为0(0x0)。 定时器通过:14个输入引号:14退出引用:15线程''(0x132c)已退出,代码为0(0x0)。 定时器通过:15个输入引号:15退出引用:16线程''(0x3f8)已退出,代码为0(0x0)。 定时器通过:16个输出引号:16退出引用:17线程''(0x10cc)已退出,代码为0(0x0)。 定时器通过:17线程''(0x1534)退出代码0(0x0)。 输入的行情:17退出行情:18线程''(0x1050)已退出,代码为0(0x0)。 线程''(0x850)已退出,代码为0(0x0)。 定时器通过:18个输入行情:18退出行情:19线程''(0xca0)退出代码0(0x0)。 定时器通过:19个输入行情:19退出行情:20线程''(0x1120)退出代码0(0x0)。 定时器通过:20个输入引号:20出口引用:21线程''(0x508)已退出,代码为0(0x0)。 定时器通过:21个输出引号:21退出引用:22线程''(0x1598)已退出,代码为0(0x0)。 定时器通过:22个输入引号:22退出引用:23线程''(0xb2c)已退出,代码为0(0x0)。 定时器通过:23个输入引号:23退出引用:24线程''(0x1600)已退出,代码为0(0x0)。 定时器通过:24个输入引号:24退出引用:25线程''(0x13bc)已退出,代码为0(0x0)。 定时器通过:25个输入引号:25退出引用:26线程''(0x131c)已退出,代码为0(0x0)。 定时器通过:26个输入引号:26退出引用:27线程''(0x5f4)已退出,代码为0(0x0)。 定时器通过:27Entered引用:27退出引用:28线程''(0x128)退出代码0(0x0)。 定时器通过:28个输入引号:28退出引用:29线程''(0x1420)已退出,代码为0(0x0)。 定时器通过:29线程''(0xc64)已退出,代码为0(0x0)。 输入引号:29退出引号:30线程''(0xedc)已退出,代码为0(0x0)。 定时器通过:30个输出引号:30退出引用:31线程''(0x136c)已退出,代码为0(0x0)。 定时器通过:31个输出引号:31退出引用:32线程''(0xeb8)已退出,代码为0(0x0)。 定时器传递:32个输入引号:32退出引用:33线程''(0x690)已退出,代码为0(0x0)。 定时器通过:33Entered引用:33退出引用:34线程''(0x1320)退出代码0(0x0)。 定时器通过:34个输入引号:34退出引用:35线程''(0x11b8)已退出,代码为0(0x0)。 定时器通过:35个输入引号:35退出引用:36线程''(0x1684)已退出,代码为0(0x0)。 定时器通过:36个输入引号:36退出引用:37线程''(0x1294)已退出代码0(0x0)。 线程''(0x1240)已退出,代码为0(0x0)。 线程''(0xde8)已退出,代码为0(0x0)。

并停止......

并且完成了...没有好处

解决方案放线定时器计时器;在班上

3 个答案:

答案 0 :(得分:3)

  Timer timer = new Timer(new TimerCallback(GetQuotes), null, 0, 10000);
  timer.InitializeLifetimeService();

InitializeLifetimeService()返回一个你应该做某事的对象。默认租约使用10秒的超时,与您的间隔相同。如果处理时间过长,您的计时器会被取消,这似乎是合理的。

答案 1 :(得分:3)

计时器实例在ctor中声明,然后它将在相对较短的时间内被吞噬。因而计时器的死亡。在类级别固定“timer”var。

但是,一旦不再使用,就应该丢弃计时器。

干杯

答案 2 :(得分:2)

你说这是一个web服务 - 定时器不能保证在Web服务中正常工作,因为不保证拥有线程的生命周期。考虑使用应用程序域启动时创建的全局工作线程。

基本的全局工作线程是:

static bool _stopPolling = false;
static Thread _pollerThread;
static object _oneTimeLocker = new object();

private static CreatePollerThread()
{
  if(_pollerThread == null)
  {
    lock(_oneTimeLocker)
    {
      if(_pollerThread == null) //double-check
      {
        _pollerThread = new Thread(
        new ThreadStart(() => 
        { 
          while(true && !_stopPolling)
          { 
            DoWork(); 
            Thread.Sleep(10000); 
          }
        }));  
        _pollerThread.Start();
      }
    }
  }
}

我已经在那里使用了双重检查锁,以防你想要激活全局线程以响应请求(不是最佳策略 - 因为你可以有多个请求尝试初始化线程,可能会多次执行次)。这不是唯一的方法 - 但鉴于我在工作并且没有太多时间,它现在已经不知所措了!

这里的一个重要因素是_stopPolling布尔值,用于以友好的方式关闭线程。

如果你在Asp.Net中 - 那么这个SO:Application_End and background processes, exiting ASP.Net application gracefully,以及Aristos的回答,将帮助你最好地关闭线程。