繁体   English   中英

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

[英]C# thread life of timer callback

仅学习C#多线程基础知识,并尝试了解在以下情况下的回调中Threading.Timer线程发生了什么。

此C#应用程序通过执行以下操作的回调启动Timer:

  1. 记录一些信息
  2. 使用Net.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的日志记录?

谢谢


编辑

每个请求都是计时器代码。 没什么可显示的。

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

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的极限值)。 然后等待了几分钟,搜索了我的日志。 每个线程最终都返回了。 我的错。 (;•ー_一•)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM