2009-03-23 4 views
2

цитата из MSDN: http://msdn.microsoft.com/en-us/library/6kac2kdh.aspxприкладных домены и нити

Один или более управляемых нить (представленные System.Threading.Thread) могут работать в одном или любое число доменов приложения в пределах того же Права управляемого процесс. Хотя каждое приложение начинается с одного потока , код в этом приложении домен может создавать дополнительные доменов приложений и дополнительные темы. Результатом является то, что управляемая линия может свободно перемещаться между доменами приложений внутри того же управляемый процесс; у вас может быть только один поток, перемещающийся между несколькими доменами приложений .

Я попытался написать код с двумя доменами приложений, которые используют один поток. Но я сдался. Я понятия не имею, как это возможно. Не могли бы вы дать мне образец кода для этого?

ответ

8

Это можно сделать, просто создав объект, который является MarshalByRef, в отдельном AppDomain, а затем вызывает метод для этого объекта.

Возьмем, к примеру, следующее определение класса.

public interface IFoo 
{ 
    void SomeMethod(); 
} 

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

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

Затем вы можете использовать это определение для вызова в отдельный AppDomain из текущего. В тот момент, когда вызов записывается в Консоль, у вас будет 1 поток в 2 AppDomains (в 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(); 
} 
+0

так что Thread.GetDomain() не привязан к appdomain, который создал поток. он динамичен на основе текущего вызова ... не понимаю! большое спасибо! –

0

Вызов метода на объект другого домена приложения.

0

Возможно, это связано с тем, что английский не является моим первым языком, но документация немного запутывает меня.

Чтобы уточнить, когда вы создаете новые AppDomains, вы не получите дополнительные потоки. Если вы вызываете методы через прокси-сервер MarshalByRef, это делается через основной поток, если вы сами не создаете дополнительные потоки.

I.e. поведение по умолчанию при создании дополнительных AppDomains заключается в том, что один поток будет использоваться совместно с различными AppDomains.

+0

Я не уверен, почему это так, но выглядит так ... –

Смежные вопросы