Skip to content

线程上下文流动

🏷️ C# 学习 C#

当程序中新建一个线程时,执行上下文会自动地从当前线程流入到新建的线程之中,这样做可以保证新建的线程天生具有与主线程相同的安全设置和文化设置。

代码示例

点击查看代码
cs
using System;
using System.IO;
using System.Security;
using System.Security.Permissions;
using System.Threading;

namespace ExecutionContextFlow
{
    class Program
    {
        private static string _testFIle = "D:\\TestContext.txt";

        static void Main(string args)
        {
            try
            {
                // 建立测试文件
                CreateTestFile();

                // 测试当前线程安全上下文
                Console.Write("主线程权限测试:");
                TestPermission(null);
                // 建立一个子线程
                Console.Write("子线程权限测试:");
                Thread son1 = new Thread(TestPermission);
                son1.Start();
                son1.Join();
                // 现在修改安全上下文
                // 阻止文件访问
                FileIOPermission fip = new FileIOPermission(FileIOPermissionAccess.AllAccess, _testFIle);
                fip.Deny();
                Console.WriteLine("已阻止文件访问");

                // 测试当前线程安全上下文
                Console.Write("主线程权限测试:");
                TestPermission(null);
                // 建立一个子线程
                Console.Write("子线程权限测试:");
                Thread son2 = new Thread(TestPermission);
                son2.Start();
                son2.Join();
                // 现在修改安全上下文
                // 恢复文件访问
                SecurityPermission.RevertDeny();
                Console.WriteLine("已恢复文件访问");

                // 测试当前线程安全上下文
                Console.Write("主线程权限测试:");
                TestPermission(null);
                // 建立一个子线程
                Console.Write("子线程权限测试:");
                Thread son3 = new Thread(TestPermission);
                son3.Start();
                son3.Join();

                Console.Read();
            }
            finally 
            {
                // 删除测试文件
                DeleteTesfFile();
            }
        }

        /// <summary>
        /// 建立测试文件
        /// </summary>
        static void CreateTestFile()
        {
            if (!File.Exists(_testFIle))
            {
                using (FileStream fs = File.Create(_testFIle))
                {

                }
            }
        }

        /// <summary>
        /// 删除测试文件
        /// </summary>
        private static void DeleteTesfFile()
        {
            try
            {
                if (File.Exists(_testFIle))
                {
                    File.Delete(_testFIle);
                }
            }
            catch (Exception)
            {

                throw;
            }
        }

        /// <summary>
        /// 尝试访问文件来测试安全上下文
        /// </summary>
        /// <param name="state"></param>
        private static void TestPermission(object state)
        {
            try
            {
                // 尝试访问文件
                File.GetCreationTime(_testFIle);
                // 如果没有异常则测试通过
                Console.WriteLine("权限测试通过");
            }
            catch (SecurityException)
            {
                // 表明没有权限访问
                Console.WriteLine("权限测试没有通过");
            }
        }

    }
}

输出结果

点击查看输出结果
主线程权限测试:权限测试通过
子线程权限测试:权限测试通过
已阻止文件访问
主线程权限测试:权限测试没有通过
子线程权限测试:权限测试没有通过
已恢复文件访问
主线程权限测试:权限测试通过
子线程权限测试:权限测试通过