Согласно множественным ресурсам ( например, MSDN и CLR через C #), когда мы вызываем AppDomain.Unload (userDomain), потоки в userDomain будут вынуждены генерировать исключение ThreadAbortException, которое нельзя остановить, пока мы не вызовем Thread.ResetAbort. Итак, я попробовал приведенный ниже код, чтобы подтвердить свое недооценку. Один поток, созданный в домене по умолчанию, запускает приведенный ниже код для вызова объекта foo из FooType, который создается в другом домене (то есть в домене пользователя)
void ThreadRun(object o)
{
try
{
// this call will cross the App domain;
foo.Run();
}
catch (AppDomainUnloadedException EXP)
{
Console.WriteLine("Get appdomain unload exception");
}
catch (ThreadAbortException EXP)
{
Console.WriteLine("Get threadAbortException in ThreadRun");
}
Console.WriteLine("Strange, this thread is still alive");
}
Код Foo.Run приведен ниже (он ничего не делает, а просто спит)
public class FooType : MarshalByRefObject {
public void Run()
{
try
{
Console.WriteLine("Foo.Run is running at " + Thread.GetDomain().FriendlyName);
Thread.Sleep(TimeSpan.FromSeconds(1500));
}
catch (ThreadAbortException)
{
Console.WriteLine("get thread abort exception");
}
}
}
ЕСЛИ я попытался выгрузить userDomain, я был удивлен, что ThreadAbortException было обнаружено только в FooType: Run () (который находится в userDomain), но не в методе ThreadRun () (который находится в defaultDomain). И ThreadRun () получает только исключение AdException AppDomainUnlo, а затем продолжает работу.
Если я попытался напрямую прервать поток, не выгружая домен, исключение ThreadAbortException было обнаружено в обоих местах.
Интересно, должна ли эта разница возникать? Большое спасибо