C# 应用程序域和线程

Posted

技术标签:

【中文标题】C# 应用程序域和线程【英文标题】:C# AppDomains and Threads 【发布时间】:2011-07-13 19:47:17 【问题描述】:

我提出了一个让我彻夜难眠的小问题。也许这很容易理解,但我还不能。

哪个更好? Thread 中的 AppDomain,还是新 AppDomain 中的 Thread?

这两者之间的区别是:

static void Main() 
    AppDomain ad = AppDomain.CreateDomain ("NewDomain");
    Thread t = new Thread (delegate()  ad.DoCallBack (SomeMethod); );
    t.Start();


static void SomeMethod()  

还有:

public void Start() 
    myAssembly = Assembly.LoadFrom(dllFileName);
    Type myType = AssEnsamblado.GetType(myAseembly.Type);
    MethodInfo myMethod = tipo.GetMethod(@"StartDLL");
    object obj = Activator.CreateInstance(myType);
    Thread thrBase = new Thread(new ThreadStart(delegate()  myMethod.Invoke(obj, null); ));
    thrBase.Start();

上面的 sn-p 在继承自 MBRO 的类中执行,以创建远程实例并调用包含该代码的方法。

【问题讨论】:

动机是什么?你想达到什么目标? 嗨!主要目标是通过 WCF 进程间在两个应用程序域之间进行通信。这已经完成了,但是我还没有找到关闭客户端而不是中止线程的好方法。所以我一直在研究,也许最好有一个远程类来控制和执行方法,或者控制持有新应用程序域的线程。也许这种方法是错误的。所以,我一直在研究。感谢您的关注。 【参考方案1】:

我会冒险说,一旦您的代码在新的应用程序域中执行,这两种方式几乎没有区别。

问题在于与其他应用程序域的交叉,可能需要对传递/返回到新应用程序域的对象(如果支持的话)进行序列化/编组。

【讨论】:

嗨!我已经在编组对象,我需要它来调用初始化客户端的方法。但是我仍然想知道这可能是最好的方法,以关闭客户端。感谢您的关注。【参考方案2】:

远离此类代码(任一示例)。除非你喜欢花数周时间在这里和那里调试奇怪的异常,否则它会让你的生活变得地狱般。

面对 root 问题 - 优雅地关闭远程作业。通常有很多方法可以做到这一点,包括取消或终止它的不同方法,但调用肮脏的黑客Thread.Abort() 只是邪恶的。

【讨论】:

嗨!我同意,中止不是最好的方法,软件和人类。我已经通过一个事件来关闭客户端,该事件指向正在创建和打开通道的类。让我们看看这是否有效。感谢您的关注。 @BlackCath 可能检查Task 类,它支持取消,或者可能在另一个问题中发布您的客户端-服务器代码,看看人们认为什么是最好的方法。

以上是关于C# 应用程序域和线程的主要内容,如果未能解决你的问题,请参考以下文章

《C#零基础入门之百识百例》(四十九)类成员的作用域和生命期 -- 求N位自幂数

引用 C# 中的主线程

在 C# 应用程序退出时清理非托管 C++ 线程

C#多线程解决程序卡顿问题

C# 多线程

C#多线程编程