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

本文关键字:线程 回调 定时器 | 更新日期: 2023-09-27 18:12:33

正在学习c#多线程基础知识,并试图了解线程发生了什么。以下场景中的回调计时器线程

这个c#应用程序用一个回调函数启动一个Timer,执行以下操作:

  1. 记录一些信息
  2. 使用净。HttpWebRequest查询REST服务器
  3. 记录更多信息

定时器间隔非常快(500毫秒)。当查询失败时(因为我在运行时拔掉了网线),我会看到#1中的日志,并知道这需要一些时间,但最终我希望看到#3中的匹配日志。相反,就好像线程(我相信来自线程池)死了一样。不总是正确的。只是大多数时候。

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

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

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;
}

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

感谢

编辑

每个请求都是Timer代码。不过没什么好展示的

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

private void getCurrentCount(object obj)
{
    if (sendPostToServer(this.serverUrlNPort, LinkCounter.postCount, out this.currentCount))
    {
        // do stuff with currentCount
    }
}

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

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

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

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

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