2013-12-22 2 views
0
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.StackOverflowException' произошло в System.Windows.Forms.dll"

while (!cefGlueBrowserForm.Done || tThen.AddSeconds(15) > DateTime.Now); 

исключение из

An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll

Вот описание ошибки: http://msdn.microsoft.com/en-us/library/w6sxk224%28v=vs.90%29.aspx

Удостоверьтесь, что у вас нет бесконечный цикл или бесконечная рекурсия.

Too many method calls is often indicative of a very deep or unbounded recursion.

так что я могу сделать? Мне нужно подождать, пока не закончится какой-либо код в cefGlueBrowserForm или не достигнуто время. Но почему же тогда ошибка, у меня есть время проверить ...

+0

Ваше состояние в || не будет проверяться. Если первое условие верно. –

+2

Не удаляйте [свой исходный вопрос] (http://stackoverflow.com/questions/20731211/an-unhandled-exception-of-type-system-stackoverflowexception-occurred-in-syste), чтобы повторно опубликовать его , – hvd

+0

Посмотрите на столик! – JeffRSon

ответ

1

От MSDN docs

The conditional-OR operator (||) performs a logical-OR of its bool operands. If the first operand evaluates to true, the second operand isn't evaluated.

Ваше второе условие в || не будет проверена, если первое условие истинно.

Эта программа иллюстрирует концепцию

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; 
    } 
} 
+0

Нелепо, поскольку второе условие в вопросе не имеет побочных эффектов. Изменить: Вообще-то, я мог бы полностью не понимать точку вашего ответа. На данный момент Downvote удален, но вы бы уточнили? Точка зрения, условие в вопросе не содержит побочных эффектов. – hvd

+0

«Но почему тогда ошибка, у меня есть проверка времени ...» Я полагаю, что проверка времени не хороша, если это не проверяется. –

+1

А теперь я вижу вашу точку, которая по существу «вы хотите» && ' , а не '||' ". Это не ясно из вашего ответа, но вы правы. Обратите внимание, что если вы используете '|' вместо '||', где будет проверен второй операнд, у вас будет такая же проблема. – hvd

1

Application.DoEvents есть зло, не использовать. Это может вызвать необъяснимые эффекты - например, StackOverflow. Следует избегать ожидания в потоке пользовательского интерфейса. Чтобы исправить это, используйте, например, BackgroundWorker.

+0

Почему BackgroundWorker, если мне просто нужно подождать? Мне не нужен процесс BackgroundWorker только для ожидания. Или я? – mbrc

+0

Вы, очевидно, используете 'Application.DoEvents' для предотвращения блокировки потока графического интерфейса. Правильный способ сделать это - переместить блокирующую часть в фоновый поток. Однако, если вы можете использовать .Net Framework 4.5, проще использовать async/await. – JeffRSon

+0

Можете ли вы привести мне пример, как вы это понимаете? thx – mbrc

Смежные вопросы