我一直在阅读有关应用程序域和线程的一些内容,我发现了这个声明:
“特定线程不限于单个应用程序域。也就是说,线程可以自由跨越应用程序域边界;不会为每个应用程序域创建新线程。”
现在这一切都很好,但我想到了自己 - 究竟什么时候线程的跨越?
我见过人们创建应用程序域并使用CreateInstanceAndUnwrap和MarshalByRefObject的示例。但是 - 在完全独立的过程之间可以进行编组!所以 - 这不是我所谓的“自由交叉”。
任何人都可以提供跨越应用程序域的线程的示例(C#)代码而不进行编组,因为我不认为这是“免费”的吗? (或者我像往常一样完全糊涂了。)
答案 0 :(得分:1)
嗯,简单,CreateInstanceAndUnwrap()使线程跨越AppDomain屏障。毕竟,创建的对象存在于AD中,线程必须进行转换才能调用构造函数。当您通过代理调用类方法调用时,会发生额外的交叉。
并且AppDomain 不是代码的障碍,它隔离了数据。每个AD都有自己的GC和加载器堆。需要序列化才能跨越数据障碍。但它是再次反序列化并继续执行的完全相同的线程。这与进程之间的编组完全不同,在两个不同的线程之间发生。由于在不同的虚拟内存视图和所需的线程上下文切换之间进行编组的相当大的开销。 AD是一个很多更便宜的流程版本。
答案 1 :(得分:0)
我不相信用户线程可以跨越多个appDomains。但是,CLR工作线程,GC线程等将会并且可以做到。
答案 2 :(得分:0)
一个示例可能是调用本机代码,本机代码在另一个appdomain中调用回调。
在进程内部进行封送可能会使用优化路由,其中在多个AppDomain中使用相同的OS线程。