Где должен быть мой блок Try Catch при запуске потока? - PullRequest
1 голос
/ 27 июня 2011

Возьмите эту нить:

Thread thread = new Thread(delegate()
            {
                //Code
            });

            thread.Start();

Должно ли оно быть вокруг thread.Start(); или внутри:

Thread thread = new Thread(delegate()
            {
                try
                {
                    //Code
                }
                catch (Exception)
                {
                    //Code
                }
            });

Ответы [ 4 ]

6 голосов
/ 27 июня 2011

это совершенно другое, чтобы положить его тогда внутри или снаружи.

Если вы поместите их вокруг вызова thread.Start(), вы можете обнаружить (согласно этой странице: http://msdn.microsoft.com/en-us/library/system.threading.thread.start(v=vs.71).aspx)

  • ThreadStateException Поток уже запущен.
  • SecurityException Вызывающая сторона не имеет соответствующей SecurityPermission.
  • OutOfMemoryException Недостаточно памяти для запуска этого потока.
  • NullReferenceException Этот метод был вызван для ссылки на поток, которая является пустой ссылкой (Nothing в Visual Basic).

Если вы поместите его внутрь, вы обнаружите исключение внутри кода, который вы будете запускать в вашем потоке.Так что любое исключение вы хотите.

3 голосов
/ 27 июня 2011

Исключения, относящиеся к логике, которую вы имеете в делегате, должны обрабатываться внутри делегата.

thread.Start() сам может бросить только ThreadStateException или OutOfMemoryException.

2 голосов
/ 27 июня 2011

Предотвращение молчаливого прерывания thred

Это объясняет, как разместить пробную защелку внутри делегата. В нем также говорится о том, что вам необходимо провести уборку в случае необходимости.

1 голос
/ 27 июня 2011

Если, как вы упомянули выше, ошибка в коде делегата, поместите туда try-catch и зарегистрируйте исключение. В качестве альтернативы, если вы хотите, чтобы это исключение было передано обратно в исходный поток, используйте асинхронный делегат (вызов EndInvoke повторно вызовет исключение для вызывающего потока или использование фонового работника и подпишется на событие RunWorkerCompleted (это имеет свойство error в аргументах события) .

...