домены и потоки приложений - PullRequest
2 голосов
/ 23 марта 2009

Цитата из MSDN: http://msdn.microsoft.com/en-us/library/6kac2kdh.aspx

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

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

Ответы [ 3 ]

8 голосов
/ 23 марта 2009

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

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

public interface IFoo
{
    void SomeMethod();
}

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

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

Затем вы можете использовать это определение для вызова отдельного домена приложений из текущего. В момент, когда вызов записывается в консоль, у вас будет 1 поток в 2 доменах приложений (в 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 голосов
/ 23 марта 2009

Это может быть потому, что английский не мой родной язык, но документация меня немного смущает.

Просто чтобы уточнить при создании новых доменов приложений, вы не получите дополнительные темы. Если вы вызываете методы через прокси MarshalByRef, это делается через основной поток, если вы сами не создаете дополнительные потоки.

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

0 голосов
/ 23 марта 2009

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

...