定时器回调的c#线程寿命
本文关键字:线程 回调 定时器 | 更新日期: 2023-09-27 18:12:33
正在学习c#多线程基础知识,并试图了解线程发生了什么。以下场景中的回调计时器线程
这个c#应用程序用一个回调函数启动一个Timer,执行以下操作:
- 记录一些信息
- 使用净。HttpWebRequest查询REST服务器
- 记录更多信息
定时器间隔非常快(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
}
}
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是一个限制)。然后等了几分钟,翻了翻我的日志。每个线程最终都返回了。我的坏。(;•_ _ _•)