Домены и потоки приложений
Цитата из MSDN: http://msdn.microsoft.com/en-us/library/6kac2kdh.aspx
Один или несколько управляемых потоков (представленных System.Threading.Thread) могут выполняться в одном или любом количестве доменов приложений в одном и том же управляемом процессе. Хотя каждый домен приложения запускается с одного потока, код в этом домене приложения может создавать дополнительные домены приложений и дополнительные потоки. В результате управляемый поток может свободно перемещаться между доменами приложений внутри одного и того же управляемого процесса; у вас может быть только один поток, перемещающийся между несколькими доменами приложений.
Я пытался написать код с 2 доменами приложений, которые разделяют один поток. Но я сдался. Я действительно понятия не имею, как это возможно. Не могли бы вы дать мне пример кода для этого?
3 ответа
Это можно сделать, просто создав объект 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();
}
Это может быть потому, что английский не мой родной язык, но документация меня немного смущает.
Просто чтобы уточнить, когда вы создаете новые домены приложений, вы не получаете дополнительные темы. Если вы вызываете методы через MarshalByRef
прокси это делается через основной поток, если вы сами не создаете дополнительные потоки.
Т.е. поведение по умолчанию при создании дополнительных доменов приложений состоит в том, что один поток будет совместно использоваться различными доменами приложений.