C#线程寿命的定时器回调

时间:2015-09-11 15:16:27

标签: c# multithreading timer

学习C#多线程基础知识,并尝试了解以下场景中回调中Threading.Timer线程会发生什么。

这个C#应用程序启动一个带有回调的Timer,执行以下操作:

  1. 记录一些信息
  2. 使用Net.HttpWebRequest查询REST服务器
  3. 记录更多信息
  4. 定时器间隔非常快(500毫秒)。 当查询失败时(因为我在运行时拔下网线),我看到来自#1的日志并知道它需要一些时间,但最终我希望看到来自#3的匹配日志。相反,它就像线程(我相信来自线程池)就好了。不总是。大部分时间都是。

    当我重新连接网络时,查询成功,我总是看到来自#3的日志。

    回调步骤#2是以下代码:

    let b: [Int] = arr.map { x in
      var y = x + 2
      return y 
    }
    

    那么,当任务需要一段时间时,为什么线程没有完成并完成步骤#3的记录?

    由于

    修改

    这里的每个请求是定时器代码。虽然没什么可说的。

    private bool sendPostToServer(string url, string postCommand, out int tCnt)
    {
        bool success = false;
        tCnt = 0;
        string newUrl = url + postCommand;
        System.Net.HttpWebRequest httpWebRequest = System.Net.WebRequest.Create(newUrl) as System.Net.HttpWebRequest;
        httpWebRequest.Method = "POST";
    
        byte[] postByteArray = Encoding.UTF8.GetBytes("");
        httpWebRequest.ContentType = "application/json; charset=utf-8";
        httpWebRequest.ContentLength = postByteArray.Length;
    
        System.IO.Stream dataStream = null;
        try
        {
            dataStream = httpWebRequest.GetRequestStream();
        }
        catch (Exception e)
        {       
            String errMsg = String.Format("FAILED to connect to REST Server!");
    
            if (!this.errorDialogWasDisplayed)
            {
                App.Current.Dispatcher.BeginInvoke(new Action(() => Dialogs.CustomMsgBox.CustomMessageBox.Show(errMsg, "",
                System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error)),
                System.Windows.Threading.DispatcherPriority.Background, null);
            }
        }
    
        if (dataStream != null)
        {
            dataStream.Write(postByteArray, 0, postByteArray.Length);
            dataStream.Close();
    
            try  // try-A
            {
                System.Net.WebResponse response = httpWebRequest.GetResponse();
                dataStream = response.GetResponseStream();
    
                try // try-B
                {
                    System.IO.StreamReader reader = new System.IO.StreamReader(dataStream);
                    string responseFromServer = reader.ReadToEnd();
                    if (Int32.TryParse(responseFromServer, out tCnt))
                    {
                        success = true;
                    }
                    else
                    {
                        Debug.WriteLine("ERROR - sendPostToServer - tryparse failed");
                    }
                    reader.Close();
    
                } // end of try-B
                catch (Exception e)
                {
                    Debug.WriteLine("ERROR - sendPostToServer - StreamReader failed");
                }
    
                if (response != null)
                {
                    response.Close();
                }
    
                if (dataStream != null)
                {
                    dataStream.Close();
                }
    
            } // end of try-A
            catch (Exception e)
            {
                Debug.WriteLine("ERROR - sendPostToServer - GetResponse failed"); // or GetResponseStream failed
            }                
        } // end of if (dataStream != null)
    
        return success;
    }
    

    回调:

    this.timer = new System.Threading.Timer(getCurrentCount, null, 0L, pollingInterval);
    

2 个答案:

答案 0 :(得分:0)

https://msdn.microsoft.com/en-us/library/vstudio/system.timers.timer(v=vs.100).aspx

如果SynchronizingObject属性为null,则在ThreadPool线程上引发Elapsed事件。如果Elapsed事件的处理持续时间超过Interval,则可能会在另一个ThreadPool线程上再次引发该事件。在这种情况下,事件处理程序应该是可重入的。

您是否在计时器上设置了SynchronizingObject?

答案 1 :(得分:0)

汉斯是对的。 在我达到250个线程之前,做了另一次测试并重新连接了电缆(在某处读取250是一个限制)。然后等了几分钟,搜索了我的日志。每个线程最终都会返回。 我的错。 (;•ー_一•)