我有奇怪的情况,我想调查。我会问你具体的问题,也许你可以帮我弄清楚哪些是现实所以我可以专注于调查那些现实的原因?
在我的应用程序中,这发生在计时器内:
private void timer1_Tick(object sender, EventArgs e)
{
try
{
// Thread is running - exit timer
if (isThreadRunning)
{
HelperMethods.AppendToLogFile("Inside timer. Thread didn't finish yet so we quit the timer.", LogType.Information);
return;
}
// If we got this far, thread is not running, let's start it
Thread myThread = new Thread(MainProcessingThread);
myThread.IsBackground = true;
isThreadRunning = true;
myThread.Start();
}
catch (Exception ex)
{
HelperMethods.AppendToLogFile("Exception inside timer. "+ex.Message, LogType.Error);
}
}
这是主要的线程方法:
public void MainProcessingThread()
{
try
{
// Main method
HelperMethods.TryProcessAll(threeDaysAgo.ToString("dd-MM-yyyy"),
yesterday.ToString("dd-MM-yyyy"),
Properties.Settings.Default.username,
Properties.Settings.Default.password))
// Flag which indicates thread was finished
isThreadRunning = false;
}
catch (Exception ex)
{
HelperMethods.AppendToLogFile("Exception inside MainProcessingThread: "+ex.Message, LogType.Error);
isThreadRunning = false;
return;
}
return;
}
当我查看日志文件时,连续输入(超过36小时):"内部计时器。线程还没有完成,所以我们退出了计时器。"。申请还活着;这些消息来自计时器内部。
这意味着isThreadRunning
始终为真 - 即使在36小时内方法TryProcessAll
必须终止 - 之后isThreadRunning
将设置为false。但我的日志文件看起来像这样:
"Inside timer. Thread didn't finish yet so we quit the timer."
"Inside timer. Thread didn't finish yet so we quit the timer."
"Inside timer. Thread didn't finish yet so we quit the timer."
"Inside timer. Thread didn't finish yet so we quit the timer."....
我的问题:
TryProcessAll
内有堆栈溢出异常会导致只杀死该线程吗?那时为什么我回来时计时器还活着? TryProcessAll
内有内存不足,为什么不记录?我记录TryProcessAll
内的所有异常。MainProcessingThread
吗?在那种情况下,这可以解释为什么每次检查时都会调用计时器isThreadRunning
是真的 - 所以它打印了我说的那条消息。 TryProcessAll
答案 0 :(得分:0)
Ahahahahahaha!
我认为我们这里的想法太复杂了! 看看你在做什么:
if (isThreadRunning)
{
HelperMethods.AppendToLogFile("Inside timer. Thread didn't finish yet so we quit the timer.", LogType.Information);
return;
}
// If we got this far, thread is not running, let's start it
Thread myThread = new Thread(MainProcessingThread);
myThread.IsBackground = true;
isThreadRunning = true;
myThread.Start();
现在猜猜一旦线程结束会发生什么? ==>你重新开始。只要没有错误发生,您将始终获得确切的行:
Inside timer. Thread didn't finish yet so we quit the timer.
所以,不,没有什么奇怪的事情发生。你只是不检查线程是否已运行一次并完成或尚未运行!
它运行,完成,重新开始......
你的无限循环!
答案 1 :(得分:-1)
通常,在OutOfMemoryException和SatckOverflowException之后,您的程序处于相当不稳定的状态,即异常状态。
在这样的例外之后你不应该做更多的事情。
不能保证像写日志这样的操作会成功进行。 (因为它不会获得更多内存)
<小时/> 修改:清除
如果一个线程分配了内存,则会调用底层操作系统,并请求扩大进程&#39;记忆。如果操作系统无法遵守此请求,则抛出OutOfMemoryException。从这一点开始,所有对更多内存的请求都将失败。如果线程遇到另一个内存分配请求(任何字符串操作,任何新操作),则此操作将失败并返回另一个OutOfMemoryException。
这意味着,在OutOfMemoryException之后只有非常简单的代码,保证不分配额外的内存就可以执行。
对记录器机制的调用当然不够简单。