C# &引用;类型为';的未处理异常;System.StackOverflowException';在System.Windows.Forms.dll中发生;
几个小时后我就开始排队了C# &引用;类型为';的未处理异常;System.StackOverflowException';在System.Windows.Forms.dll中发生;,c#,winforms,stack-overflow,C#,Winforms,Stack Overflow,几个小时后我就开始排队了 DateTime tThen = DateTime.Now; do { Application.DoEvents(); } while (!cefGlueBrowserForm.Done || tThen.AddSeconds(15) > DateTime.Now); string htmlSource = cefGlueBrowserForm.DocumentDomHtml; propertyBag.GetResponse = () => new
DateTime tThen = DateTime.Now;
do
{
Application.DoEvents();
} while (!cefGlueBrowserForm.Done || tThen.AddSeconds(15) > DateTime.Now);
string htmlSource = cefGlueBrowserForm.DocumentDomHtml;
propertyBag.GetResponse = () => new MemoryStream(Encoding.UTF8.GetBytes(htmlSource));
cefGlueBrowserForm.Dispose();
例外
System.Windows.Forms.dll中发生类型为“System.StackOverflowException”的未处理异常
以下是错误描述:
确保没有无限循环或无限递归
太多的方法调用通常表示非常深或无限的递归
那我该怎么办?我需要等到cefGlueBrowserForm中的一些代码完成或到达时间。但为什么会出错,我有时间检查…来自 条件OR运算符(| |)对其布尔操作数执行逻辑OR。如果第一个操作数的计算结果为true,则不计算第二个操作数 如果第一个条件为真,则不会检查
|
中的第二个条件
这个节目说明了这个概念
while (!cefGlueBrowserForm.Done || tThen.AddSeconds(15) > DateTime.Now);
Application.DoEvents
是邪恶的,不要使用它。它可能会造成无法解释的影响,如堆栈溢出。应避免在UI线程中进行繁忙等待。要修复它,例如,BackgroundWorker
不会检查您在| |中的状态。如果第一个条件为真。请不要删除只是为了重新发布。看看调用堆栈@穆罕默德,你说得对这是错误的。我还需要比较器来比较日期,而不是simle>我是对的|
是错的。听起来很有趣。不相关,因为问题中的第二个条件没有副作用。编辑:事实上,我可能完全误解了你回答的要点。否决票暂时取消,但你能详细说明一下吗?重点是,问题中的条件没有副作用。“但是为什么会出现错误,我有时间检查……”我想如果没有检查时间检查就没有任何好处。啊,现在我明白了你的观点,基本上是“你想要&
,而不是|
”。你的回答不清楚,但你是对的。请注意,如果使用第二个操作数求值的|
而不是|
,您仍然会遇到同样的问题。您认为这与StackOverlow异常有什么关系?是的,这更清楚了,谢谢。不过,我仍然认为您关注的是错误的方面,因为即使计算了|
的第二个操作数,代码也不会按预期工作。如果我只需要等待,为什么要使用BackgroundWorker?我不需要仅仅为了等待而对工作流程进行后台处理。还是我?您显然使用了Application.DoEvents
来防止阻塞GUI线程。正确的方法是将阻塞部分移动到背景线程。如果您可以使用.NETFramework4.5,那么使用async/await可能会更容易。对不起,这个主题太宽了。而且我对你的项目了解不够。只需搜索“c#async wait”即可找到大量信息和示例。Re Doe事件参见示例和
class Program
{
static void Main(string[] args)
{
Console.WriteLine( p() || q() ); //prints Return True from p , True
Console.WriteLine( q() || p() ); //prints Return False from q, Return true from p, True
}
static bool p()
{
Console.WriteLine("Return True");
return true;
}
static bool q()
{
Console.WriteLine("Return False");
return false;
}
}