为什么选择 Thread.CurrentContext 属性和 Thread.GetDomain() 方法

本文关键字:Thread GetDomain 方法 属性 选择 CurrentContext 为什么 | 更新日期: 2023-09-27 17:55:47

这不是

一个重要的问题,但我想知道为什么Thread类公开了一个用于获取当前上下文的属性(Thread.CurrentContext)和一个用于获取当前AppDomain的方法(Thread.GetDomain())。

了解进程> AppDomain>上下文>线程的层次结构后,我的假设是线程的上下文在当前时间点是已知的,并且需要根据当前上下文搜索域。

但我想听到更明智的答案。谢谢!

为什么选择 Thread.CurrentContext 属性和 Thread.GetDomain() 方法

我的假设是线程的上下文当前是已知的 时间点,需要根据当前搜索域 上下文。

实际上,在 .NET Framework 的当前实现中,Context对象保留对其父域的引用。框架设计者可能已将上下文的域公开为Thread.Context.Domain 。这可能是一个反问,为什么他们不这样做;我无法通过查看参考源代码来判断这一点。

重要的是,在任何给定的时刻,线程都在执行特定域中的代码。这将是进程的默认域,或者通过AppDomain.DoCallBackAppDomain.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,
                });
        }
    }
}