[英]C# thread life of timer callback
仅学习C#多线程基础知识,并尝试了解在以下情况下的回调中Threading.Timer线程发生了什么。
此C#应用程序通过执行以下操作的回调启动Timer:
计时器间隔非常快(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.