2

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

一个或多个托管线程(由 System.Threading.Thread 表示)可以在同一托管进程内的一个或任意数量的应用程序域中运行。尽管每个应用程序域都以单个线程启动,但该应用程序域中的代码可以创建额外的应用程序域和额外的线程。结果是托管线程可以在同一托管进程内的应用程序域之间自由移动;您可能只有一个线程在多个应用程序域之间移动。

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

4

3 回答 3

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();
}
于 2009-03-23T20:35:53.943 回答
0

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

于 2009-03-23T20:36:44.207 回答
0

这可能是因为英语不是我的第一语言,但文档让我有点困惑。

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

即当创建额外的AppDomains 时的默认行为是一个线程将在不同的AppDomains 之间共享。

于 2009-03-23T20:45:55.917 回答