学习C#多线程基础知识,并尝试了解以下场景中回调中Threading.Timer线程会发生什么。
这个C#应用程序启动一个带有回调的Timer,执行以下操作:
定时器间隔非常快(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);
答案 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)