2

MSDN からの引用: http://msdn.microsoft.com/en-us/library/6kac2kdh.aspx

1 つ以上のマネージド スレッド (System.Threading.Thread で表される) は、同じマネージド プロセス内の 1 つまたは任意の数のアプリケーション ドメインで実行できます。各アプリケーション ドメインは 1 つのスレッドで開始されますが、そのアプリケーション ドメイン内のコードは、追加のアプリケーション ドメインと追加のスレッドを作成できます。その結果、マネージ スレッドは、同じマネージ プロセス内のアプリケーション ドメイン間を自由に移動できます。複数のアプリケーション ドメイン間で移動するスレッドが 1 つだけの場合もあります。

1 つのスレッドを共有する 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 つの AppDomains に 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

これは、英語が母国語ではないためかもしれませんが、ドキュメントが少しわかりにくいです。

新しい AppDomains を作成するときに明確にするために、追加のスレッドは取得しません。プロキシを介してメソッドを呼び出す場合、MarshalByRef自分で追加のスレッドを作成しない限り、これはメイン スレッドを介して行われます。

つまり、追加の AppDomain を作成するときのデフォルトの動作では、1 つのスレッドが異なる AppDomain 間で共有されます。

于 2009-03-23T20:45:55.917 に答える