Здравствуйте, another_coder, Вы писали:
_>Как запустить поток так, чтобы строка, выводящая "waiting" выполнилась и программа нормально завершилась?
Обернуть запускаемый код в свой хелпер с try-catch. Чужой недоверенный код — вынести в отдельный домен/процесс (смотря насколько всё запущено).
Re: Unhandled exception из Thread: как не валить процесс?
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, another_coder, Вы писали:
_>>Как запустить поток так, чтобы строка, выводящая "waiting" выполнилась и программа нормально завершилась? S>Обернуть запускаемый код в свой хелпер с try-catch. Чужой недоверенный код — вынести в отдельный домен/процесс (смотря насколько всё запущено).
Понятно. А так чтобы без try-catch? Хочется, чтобы поток умер просто, без остановки основного процесса. Я пробовал с AppDomain (запускал поток внутри созданного), но это не дало нужный мне результат. Вот так было:
class A : MarshalByRefObject
{
public void M()
{
var d = new Thread(RaiseException);
d.Start();
}
public static void RaiseException(object state)
{
Console.WriteLine("RaiseException");
throw new Exception();
}
}
static void Main(string[] args)
{
var ads = new AppDomainSetup();
ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
ads.DisallowBindingRedirects = false;
ads.DisallowCodeDownload = false;
ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
var ad = AppDomain.CreateDomain("AD", null, ads);
A a = (A)ad.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, "A");
a.M();
Thread.Sleep(5000);
Console.WriteLine("waiting...");
Console.ReadKey();
}
Re[3]: Unhandled exception из Thread: как не валить процесс?
Здравствуйте, another_coder, Вы писали:
_>Понятно. А так чтобы без try-catch? Хочется, чтобы поток умер просто, без остановки основного процесса.
Простой неправильный ответ: запускать как Task, уже выше предложили. И про TaskCreationOptions.LongRunning не забыть. И про обработку исключений тоже.
Сложная ужасная правда: нет такого способа. Потому что в общем случае код может натворить что угодно, от StackOverflow и до Environment.FailFast(). Ну, или испортить состояние всей программы так, что нет никакого смысла продолжать работать. Так что обрабатываем исключение, спасаем всё что можно, падаем.
Re: Unhandled exception из Thread: как не валить процесс?
_>При возникновении unhandled exception в потоке, он завершается и еще завершает процесс.
_>Как запустить поток так, чтобы строка, выводящая "waiting" выполнилась и программа нормально завершилась?
Вы бы написали,что конкретно хотите сделать.
Если вы "кидаете" исключение или при выполнении в потоке выскакивает исключение, то его, как тут уже подсказали, нужно обработать с помощью try ... catch .
Если вам надо просто передать состояние потока, например сигнализировать, что обработка в потоке закончена, то можно использовать для этих целей event and delegate или ManualResetEvent (в зависимости от потребностей).
Успехов
Re: Unhandled exception из Thread: как не валить процесс?