2014-02-17 3 views
2

В C# /. Net при возникновении ошибки стек регистрируется в журналах ошибок Windows. Однако в моем приложении много вызовов перекрестных потоков. След стека, кажется, останавливается при каждом вызове (MarshalledInvoke).C#: Стоп-стоп при вызове

, например:

мой стек:

Exception Info: Facebook.FacebookApiException 
Stack: 
at System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean) 
at System.Windows.Forms.Control.Invoke(System.Delegate, System.Object[]) 
at Test.TcpTest.InterpretData() 
at Test.TcpTest.Incoming(System.String) 
at Test.TcpTest.cLoop() 
at System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
at System.Threading.ThreadHelper.ThreadStart() 

происходит исключение в коде выполняется далее в стеке. Тем не менее, стек останавливается в marshalledInvoke каждый раз.

Есть ли что-то, что я могу сделать, чтобы продолжить стек при вызове?

ответ

5

Когда вы используете Control.Invoke() вместо Control.BeginInvoke(), любое исключение, созданное в потоке пользовательского интерфейса, переводится обратно в рабочий поток и повторно запускается. Существует некоторая потеря информации, вы получаете внутреннее исключение.

Использование Invoke() очень редко является правильным и, как правило, вредно для его возможного возникновения взаимоблокировки, обфускации исключений и задержки рабочего потока. Который блокируется до тех пор, пока поток пользовательского интерфейса не выполнит цель делегирования. Это может занять некоторое время. Убедитесь, что вы на самом деле его требуете. Это действительно необходимо, если вы вызываете метод, возвращающее значение, которое вам нужно. Этого всегда следует избегать.

Вы можете отлаживать эти исключения с помощью отладки + исключения, установите флажок «Бросок» для исключений CLR. Отладчик теперь остановится в коде, где генерируется исключение.

+0

Im, использующий вызовы для остановки «Неверная обработка кросс-потоков: управление осуществляется из потока, отличного от потока, который был создан на« ошибках ». Используется ли делегирование.invoke/begininvoke также для этих исключений? –

+2

Нет, метод BeginInvoke для делегата запускает код на отдельном рабочем потоке. это явно не ** то, что вы хотите сделать, вы хотите запустить код в потоке пользовательского интерфейса, чтобы избежать исключения «Кросс-нить». –

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