Почему свойство 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,
});
}
}
}