.NET简谈组件程序设计之(上下文与同步域)

简介:

我们继续学习.NET多线程技术,这篇文章的内容可能有点复杂。在打破常理之后,换一种新的思考模型最为头疼。这篇文章里面会涉及到一些不太常见的概念,比如:上下文、同步域等等。我也是最近才接触这些关于组件编程方面的高深技术,大家一起学习,再大的困难也是有时间限制的,只要我们坚持。

在本人的上一篇文章“.NET简谈组件程序设计之(多线程与并发管理一)”中,只是初步的带领我们学习一下关于多线程的一些基本的原理,包括线程切换,线程的开始、执行、等待、结束。

这篇文章的重点是学习关于线程的同步、互斥的机制。在多线程的应用程序中,最少会有一个主线程在运行着,如果我们想提高应用程序的吞吐量就必须借助多线程的原理来实现。[王清培版权所有,转载请给出署名]

.NET上下文(ContextBoundObject对象)

什么叫上下文,千万别和ASP.NET中的上下文搞混了,这个上下文是个形容词,在不同的场合有不同的意思。在ASP.NET中的上下文是指Context对象,这个对象基本上包容了HTTP协议的整个生命周期的信息,可以获取到客户端浏览器的一些基本信息,也可以获取到关于HTTP协议的一些信息,等等。

这里所讲的上下文是.NET程序执行的最小逻辑范围,ASP.NET上下文是站在B/S编程模型角度去看待的,而这里的上下文是站在.NET底层运行角度看来的,后者是代码的上下文,前者是整个生命周期的上下文。

在没有接触ContextBoundObject之前我一直以为.NET程序执行的最小逻辑范围是应用程序域(AppDomain),知道了之后才知道另有隐情,上下文是用来确定对象的逻辑归属,在多线程(Thread)、事物处理(Transaction)、企业服务(Enterprise)等方面都需要用上下文来对对象进行规划。下面您将看到怎么用上下文来进行线程的同步的。

图1:

.NET同步域(Synchronization特性)

同步域的概念是来源于多线程的场合,在我们进行多线程操作的时候,让很多个线程去同时访问一个内存对象的时候,是必须用锁来保证只有一个线程进入对象操作的,那么同步域的概念就是同步的是一个区域,而不是单单的一个对象。

线程是代码的执行路径,只要在这条执行路径上都属于线程的范围,那么怎么在执行的路径中分离出另外一个同步区域。[王清培版权所有,转载请给出署名]

临界资源是系统中对同一时间只能由一个线程进行访问的描述。我们假设自己就是一个线程,我们要去家里拿点东西,那么门就是线程的同步锁,当我们进去的时候就把门从里面反锁,出去的时候就把门打开,以方便自己的家人进来。这个房子就是临界资源。可能这样的描述不太靠谱,哪有这样的家啊!

图2:

利用上下文和同步域进行线程的同步

下面我们将结合上下文和同步域的原理进行线程的同步。请看一段代码:


 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Threading;  
  5. using System.Runtime.Remoting;  
  6. using System.Runtime.Remoting.Contexts;  
  7.  
  8. namespace ConsoleApplication1.多线程和并发管理  
  9. {  
  10.     //如果不加上下文,那么就是以对象为线程锁定区域,如果加上下文,那么就是已逻辑上下文为锁定区域  
  11.     [Synchronization(SynchronizationAttribute.REQUIRED, true)]//重新进入同步域  
  12.     public class MyClass : ContextBoundObject  
  13.     {  
  14.         public void DoWork()  
  15.         {  
  16.  
  17.             int i = 0;  
  18.             while (true)  
  19.             {  
  20.                 Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "|" + i++);  
  21.                 if (i == 10)  
  22.                 {  
  23.                     Console.WriteLine("---------------------------------------------");  
  24.                     Console.Read();  
  25.                     break;  
  26.                 }  
  27.             }  
  28.  
  29.         }  
  30.     }  
  31. }  

在这段代码里面,我给Myclass类加上了Synchronization特性,并且继承自上下文对象ContextBoundObject。两者必须集合使用,同步域只有在上下文中才有效。

【MSDN:将 SynchronizationAttribute 应用到一个上下文绑定对象会导致创建等待句柄和自动重置事件,这些内容不一定会被作为垃圾来回收。因此,不要在很短的时间内创建大量用 SynchronizationAttribute 标记的上下文绑定对象。】

图3:

 

图4:

我们来看调用代码:


 
 
  1. Thread currentthread = Thread.CurrentThread;  
  2.             Console.WriteLine(currentthread.Name + currentthread.ManagedThreadId);  
  3.  
  4.             MyClass myclass = new MyClass();  
  5.  
  6.             Thread thread = new Thread(new ThreadStart(myclass.DoWork));  
  7.  
  8.  
  9.             Thread thread2 = new Thread(new ThreadStart(myclass.DoWork));  
  10.             thread2.Start();  
  11.             thread.Start();  
  12.  
  13.             thread2.Join();  
  14.             thread.Join();  
  15.             Console.WriteLine(currentthread.Name + currentthread.ManagedThreadId);  
  16.             Console.Read(); 

图5:

我为了方便截图所以把循环的数字设的比较小,如果你想测试一下,可以把数字设的大一点。[王清培版权所有,转载请给出署名]

在SynchronizationAttribute对象里面有几个枚举值,是用来确定是否共享一个同步域的,有兴趣的可以自己尝试,我就不在这里多讲了。

总结:同步域和上下文对象是线程自动同步的好方法,但是他锁定的目标太大,难免导致系统的吞吐量下降,所以下面几篇文章我们将会学习怎么使用手动同步来实现更灵活的同步(Monitor、WaitHandler等),从很小的粒度进行锁定。






 本文转自 王清培 51CTO博客,原文链接:http://blog.51cto.com/wangqingpei557/652057,如需转载请自行联系原作者


相关文章
.NET 4.0下实现.NET4.5的Task类相似功能组件
【10月更文挑战第29天】在.NET 4.0 环境下,可以使用 `BackgroundWorker` 类来实现类似于 .NET 4.5 中 `Task` 类的功能。`BackgroundWorker` 允许在后台执行耗时操作,同时不会阻塞用户界面线程,并支持进度报告和取消操作。尽管它有一些局限性,如复杂的事件处理模型和不灵活的任务管理方式,但在某些情况下仍能有效替代 `Task` 类。
306 0
|
存储 开发框架 前端开发
基于Lumisoft.NET组件,使用IMAP协议收取邮件
基于Lumisoft.NET组件,使用IMAP协议收取邮件
|
存储 对象存储 Python
`openpyxl`是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它不需要Microsoft Excel,也不需要.NET或COM组件。
`openpyxl`是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它不需要Microsoft Excel,也不需要.NET或COM组件。
|
NoSQL 大数据 Redis
分享5款.NET开源免费的Redis客户端组件库
分享5款.NET开源免费的Redis客户端组件库
433 1
|
搜索推荐 API C#
.NET开源快速、强大、免费的电子表格组件
.NET开源快速、强大、免费的电子表格组件
385 0
|
前端开发 C# 数据库
.NET中使用BootstrapBlazor组件库Table实操篇
.NET中使用BootstrapBlazor组件库Table实操篇
527 0
|
开发框架 前端开发 .NET
七天.NET 8操作SQLite入门到实战 - (1)第七天BootstrapBlazor UI组件库引入
七天.NET 8操作SQLite入门到实战 - (1)第七天BootstrapBlazor UI组件库引入
456 0
|
6天前
|
存储 弹性计算 缓存
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
本文更新了2026年阿里云全系列云服务器租赁活动报价,所有特惠资源均可前往阿里云活动中心选购,整体覆盖从个人入门到企业级高性能场景的全梯度需求。其中轻量应用服务器主打极致性价比,2核2G峰值200M带宽配置每日10点、15点限时抢购价仅38元/年,2核4G配置379元/年起;高性价比的经济型e实例、通用算力型u2i实例覆盖2核4G至4核32G全档位,适配开发测试与中小型企业业务;搭载英特尔至强6处理器的第九代c9i企业级实例算力较上代提升20%,支撑高并发生产环境,不同实例规格价差清晰,用户可根据自身业务负载与预算灵活选型。
1636 116
|
7天前
|
人工智能 程序员 API
Codex 接入 DeepSeek-V4-Flash:还能补上识图,提供两套方案
Codex 接入 DeepSeek-V4-Flash 怎么配?本文覆盖 CLI 与桌面端,再用 qwen3-vl-flash 补识图,两套方案可直接照做
1113 5
|
13天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1954 9
阿里云联动百位企业安全专家,共识Agent防御最佳实践

热门文章

最新文章