C# AppDomain.Unload()如何中止线程?
根据多个资源(例如,通过C#调用MSDN和CLR),当我们调用AppDomain.Unload(userDomain)时,userDomain中的线程将被迫抛出ThreadAbortException,在调用Thread.ResetAbort之前无法停止。所以我试着用下面的代码来证明我的理解。在默认域中创建的一个线程运行以下代码来调用在另一个域(即用户域)中创建的FooType的eFoo对象 下面列出了Foo.Run代码(它只执行睡眠操作) 如果我尝试卸载userDomain,我会惊讶地发现ThreadAbortException仅在FooType:Run()中(位于userDomain中)捕获,而在ThreadRun()方法中(位于defaultDomain中)未捕获。ThreadRun()只获取AppDomainUnlo adException,然后继续运行 如果我试图在不卸载域的情况下直接中止线程,那么ThreadAbortException在这两个地方都是可行的C# AppDomain.Unload()如何中止线程?,c#,.net,appdomain,C#,.net,Appdomain,根据多个资源(例如,通过C#调用MSDN和CLR),当我们调用AppDomain.Unload(userDomain)时,userDomain中的线程将被迫抛出ThreadAbortException,在调用Thread.ResetAbort之前无法停止。所以我试着用下面的代码来证明我的理解。在默认域中创建的一个线程运行以下代码来调用在另一个域(即用户域)中创建的FooType的eFoo对象 下面列出了Foo.Run代码(它只执行睡眠操作) 如果我尝试卸载userDomain,我会惊讶地发现Th
我想知道这种差异是否会发生?非常感谢当您卸载userDomain时,当前在该域中工作的线程将获得AbortException。但是,同一个线程也“在”另一个AppDomain(main)中。将AppDomains作为数据分隔符,而不是执行分隔符,CLR无法中止生成多个AppDomains的线程。这就是为什么您只能获得UnloadedException 当您调用Thread.Abort时-您正在显式中止线程的执行,该线程当前位于AppDomain中
无论如何,当您只想卸载一些AppDomain时,您不会希望线程被中止。可能当您中止
userDomain
时,defaultDomain
可能会收到一个包装异常(内部异常为ThreadAbortException
。请尝试使用catch(异常示例)
相反,检查是否引发了不同的异常以及它是什么InnerException
。我想在这种情况下会引发AppDomainUnloadexception
。
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");
}
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");
}
}
}