应用程序域和线程

时间:2009-03-23 20:28:01

标签: c# .net multithreading applicationdomain

来自MSDN的引用:http://msdn.microsoft.com/en-us/library/6kac2kdh.aspx

  

一个或多个托管线程   (代表   System.Threading.Thread)可以运行   一个或任意数量的申请   同一个托管中的域名   处理。每个应用程序   域以单个启动   线程,该应用程序中的代码   域可以创建额外的   应用领域和其他   线程。 结果是一个托管   线程之间可以自由移动   应用程序域内部相同   管理流程;你可能只有   一个线程在几个之间移动   应用领域。

我尝试用两个共享一个线程的应用程序域编写代码。但我放弃了。我真的不知道这是怎么回事。你能给我一个代码示例吗?

3 个答案:

答案 0 :(得分:8)

这可以通过在单独的AppDomain中创建一个MarshalByRef对象然后在该对象上调用方法来完成。

以下面的类定义为例。

public interface IFoo
{
    void SomeMethod();
}

public class Foo : MarshalByRefObject, IFoo
{
    public Foo()
    {
    }

    public void SomeMethod()
    {
        Console.WriteLine("In Other AppDomain");
    }
}

然后,您可以使用此定义从当前的AppDomain调用单独的AppDomain。在呼叫写入控制台时,您将在2个AppDomain中有1个线程(在调用堆栈中的2个不同点)。以下是该示例代码。

public static void CallIntoOtherAppDomain()
{
    var domain = AppDomain.CreateDomain("Other Domain");
    var obj = domain.CreateInstanceAndUnwrap(typeof(Foo).Assembly.FullName, typeof(Foo).FullName);
    var foo = (IFoo)obj;
    foo.SomeMethod();
}

答案 1 :(得分:0)

在另一个应用程序域的对象上调用方法。

答案 2 :(得分:0)

这可能是因为英语不是我的第一语言,但文档对我来说有点混乱。

为了澄清您何时创建新的AppDomain,您不会获得其他线程。如果通过MarshalByRef代理调用方法,则通过主线程完成,除非您自己创建其他线程。

即。创建其他AppDomain时的默认行为是,将在不同的AppDomain之间共享一个线程。