Почему свойство Thread.CurrentContext и метод Thread.GetDomain()?

Это не вопрос важности, но мне было интересно, почему класс Thread предоставляет свойство для получения текущего контекста (Thread.CurrentContext) и метод для получения текущего AppDomain (Thread.GetDomain ()).

Зная иерархию Process > AppDomain > Context > Thread, я предполагаю, что контекст для потока известен в текущий момент времени, и необходимо искать домен на основе текущего контекста.

Но я хотел бы услышать более мудрые ответы. Спасибо!

1 ответ

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

Действительно, в текущей реализации.NET Framework Context Объект сохраняет ссылку на свой родительский домен. Разработчики Framework могли представить домен контекста как Thread.Context.Domain, Вероятно, это был бы риторический вопрос, почему они этого не сделали; Я не могу сказать это, глядя на исходный код ссылки.

Важно то, что в любой момент времени поток исполняет код внутри определенного домена. Это будет либо домен по умолчанию для процесса, либо домен, введенный через AppDomain.DoCallBack, AppDomain.ExecuteAssembly или маршал MarshalByRefObject -объект. Это было бы доменом Thread.GetDomain() возвращается.

Этот домен имеет как минимум один контекст (по умолчанию), но может также иметь другие контексты, созданные для ContextBoundObject -объекты. Можно явно ввести любой из этих контекстов в одном домене с помощью Context.DoCallBack или неявно из любого домена, позвонив маршалу ContextBoundObject -объект. Это было бы контекстом Thread.Context возвращается.

Между потоком и доменом или потоком и контекстом нет родительско-дочерних отношений. Однако между доменом и его контекстами существует строгая связь типа "родитель-потомок", один-ко-многим. Таким образом, домен не нужно искать на основе текущего контекста.

Если вам нравится играть с ним немного больше, вот приложение, которое я использовал:

using System;
using System.Runtime.Remoting.Contexts;
using System.Threading;

namespace ConsoleApplication
{
    public class Program
    {
        [Synchronization]
        public class CtxObject : ContextBoundObject
        {
            public void Report(string step)
            {
                Program.Report(step);
            }
        }

        public static void Main(string[] args)
        {
            Program.Report("app start");
            System.AppDomain domain = System.AppDomain.CreateDomain("New domain");

            var ctxOb = new CtxObject();
            ctxOb.Report("ctxOb object");

            domain.SetData("ctxOb", ctxOb);
            domain.DoCallBack(() => 
            {
                Program.Report("inside another domain");
                var ctxOb2 = (CtxObject)System.AppDomain.CurrentDomain.GetData("ctxOb");
                ctxOb2.Report("ctxOb called from another domain");
            });

            Console.ReadLine();
        }

        static void Report(string step)
        {
            var threadDomain = Thread.GetDomain().FriendlyName;
            Console.WriteLine(
                new
                {
                    // Thread.CurrentContext.ContextID is only unique for the scope of domain
                    step,
                    ctx = Thread.CurrentContext.GetHashCode(),
                    threadId = Thread.CurrentThread.ManagedThreadId,
                    domain = Thread.GetDomain().FriendlyName,
                });
        }
    }
}
Другие вопросы по тегам