COM+队列的C#实现

用C# 开发COM+ 组件   在.Net 中,我们可以用C# 开发组件,并把组件部署为COM+组件。这样的话,我们的组件就可以利用COM+提供的各种服务,如自动的事务管理、对象池。利用C#开发COM+组件,我们应该遵循如下步骤:      1.创建一个类,此类必须继承于ServicedComponent 类       2.给此类或类的方法添加属性来请求COM+ 服务。          如,若我们需要为某 阅读详情

以前在给学生讲解COM+队列服务的时候,曾举了个例子:
比如你想给张三一记耳光,但张三不在眼前,明天才会来,可明天你又不在,怎么也碰不到张三,怎么办呢?这时候你可以使用COM+的队列服务,把你打耳光的动作用Recorder录入COM+队列中,等张三回来了,队列服务中的Player才真正播放这个动作,把这记耳光赏给张三。
例子比较粗俗,但想起张三那个倒霉样就想笑,科技发展那么快,说不准哪天就有这样的技术出现了。
在软件运行过程中,很多操作不需要进行同步调用,也不需要进行异步通知,这时候我想起来队列服务,忽然发现用C#的反射技术很容易实现,于是用C#实现了一个简单的队列,由Recorder、Listener、Player组成。

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;

namespace ObjectQueue
{

    #region Interface

    /// <summary>
    /// 记录器接口
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface iRecorder<T>
    {
        /// <summary>
        /// 已记录条目总数
        /// </summary>
        long Total { get; }
        void Record(T MethodInfo);
        T GetNextItem();
    }

    /// <summary>
    /// 监听器接口
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface iListener<T>
    {
        void Start(int interval);
    }

    /// <summary>
    /// 播放器接口
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface iPlayer<T>
    {
        /// <summary>
        /// 已播放条目总数
        /// </summary>
        long Total { get; }
        void Play(T t);
    }
    #endregion

    #region Implementation

    public class cMethodInfo
    {

        public Object Obj { get; set; }
        public string MethodName { get; set; }
        public Object[] Params { get; set; }

        public cMethodInfo(object obj, string methodName, object[] paramArray)
        {
            Obj = obj;
            MethodName = methodName;
            Params = paramArray;
        }
    }

    public class cRecorder : iRecorder<cMethodInfo>
    {
        private long total;
        private Queue<cMethodInfo> MethodInfoQue = new Queue<cMethodInfo>();
        #region iRecorder<cMethodInfo> 成员
        public void Record(cMethodInfo MethodInfo)
        {
            MethodInfoQue.Enqueue(MethodInfo);
            Interlocked.Increment(ref total);
        }
        public cMethodInfo GetNextItem()
        {
            if (MethodInfoQue.Count > 0)
            {
                return MethodInfoQue.Dequeue();
            }
            else
            {
                return null;
            }
        }

        public long Total
        {
            get
            {
                return total;
            }
        }

        #endregion
    }

    public class cListener : iListener<cMethodInfo>
    {
        private Timer Timer1;
        private iRecorder<cMethodInfo> mRecorder;
        private iPlayer<cMethodInfo> mPlayer;
        public cListener(iRecorder<cMethodInfo> Recorder, iPlayer<cMethodInfo> Player)
        {
            mRecorder = Recorder;
            mPlayer = Player;
        }

        /// <summary>
        /// cPlayer
        /// </summary>
        /// <param name="playInterval">播放频率,单位 毫秒,最小值为100</param>
        public void Start(int interval)
        {
            if (interval < 100) interval = 100;
            Timer1 = new Timer(CheckNewItem,
                "", 1000, interval);
        }
        private void CheckNewItem(object obj)
        {
            cMethodInfo item = mRecorder.GetNextItem();
            if (item != null)
            {
                mPlayer.Play(item);
            }
        }
    }

    /// <summary>
    /// 独立线程中执行
    /// </summary>
    public class cPlayer : iPlayer<cMethodInfo>
    {

        private long total;
        #region iPlayer<cMethodInfo> 成员
        public void Play(cMethodInfo Method)
        {
            Type myType = Method.Obj.GetType();
            MethodInfo displayInfoMethod = myType.GetMethod(Method.MethodName);
            displayInfoMethod.Invoke(Method.Obj, Method.Params);
            Interlocked.Increment(ref total);
        }
        public long Total
        {
            get { return total; }
        }

        #endregion
    }
    #endregion

}


 

用C#实现一个普通计算器——栈和队列的应用 这是大二上学期课设的一道题,我当时刚好学习了C#,C#窗体应用程序的界面代码和业务代码是分开的,这比其他同学使用的C++MFC要方便很多,分享给你,希望对你有帮助。阅读本文并加以实现的话,需要有一定的C#编程基础,当然,代码里面计算中缀表达式的方法还是值得一看的。 在编辑区它是这样子的: 注意右侧的解决方案资源管理器中的文件,后面会一个一个粘上来~~~在看看运行时的效果吧: 如果了解C#窗体应 阅读详情

相关推荐

限制同一 COM 端口单一访问,需优化多线程并发性能,以及对分布式消息队列(Distributed Message Queue, DMQ)的需求,本文将分析分布式消息队列在您的串口通信场景中的适用性

限制同一 COM 端口单一访问,需优化多线程并发性能,以及对分布式消息队列(Distributed Message Queue, DMQ)的需求,本文将分析分布式消息队列在您的串口通信场景中的适用性,对比常见分布式消息队列系统(如 Apache Kafka、RabbitMQ、Amazon SQS),并提供简化的实现建议,重点满足序列化访问、异步处理和高并发需求。- 易于部署,管理界面友好 - 支持多种消息模式(点对点、发布/订阅) - 高可靠性,消息持久化。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 799

C++调用C#编写的COM组件

??????C++??????????C#???????C#?DLLC++????????????????????C#??COM???C++??? ??????????????? ????????????????????????????? ???VS2010 ???win764 32 ????C#??COM?? ????????????   ??   ??

MR_Sjx的博客 1637

C#集成Bartender实现工业标签打印:从原理到实战优化

在工业自动化和仓储物流系统中,标签与条码打印是数据可视化的关键环节,其核心原理是通过程序指令驱动打印设备,将动态数据转化为物理标识。这项技术的价值在于实现生产流程的可追溯性与效率提升,广泛应用于MES、WMS等系统。通过C#调用Bartender的COM自动化接口,开发者能够将专业标签设计能力集成到业务系统中,实现模板与数据的分离。本文聚焦于C#与Bartender的深度集成,详细解析了对象模型、批量打印、序列号处理等实战技巧,并针对性能优化和常见错误提供了解决方案,帮助开发者构建稳定高效的工业打印模块。

weixin_30219613的博客 305

在C#中使用COM+实现事务控制

.NET技术是微软大力推广的下一代平台技术,自从.NET技术架构Beta2版本的正式发布,此项技术也逐渐走向成熟和稳定。按照微软的平台系统占有率,我们不难想象得到,在未来的一两年内.NET技术必定会势如破竹一般的登上主流的技术平台,而一个新的技术平台得以快速发展的最重要的前提是:他不会彻底的摒弃以前的技术,这一点对于.NET技术来说指的就是COM/COM+技术了。 一般来说,在IT技术界以及硬件产

Ninth(天下第九)的专栏 966

LabVIEW+C#双剑合璧:5分钟搞定Bartender 2020动态条码打印(附完整DLL调用源码)

本文详细介绍了如何通过LabVIEW与C#混合编程实现Bartender 2020动态条码打印的高效解决方案。文章提供了完整的DLL调用源码,涵盖环境配置、C#核心逻辑封装、LabVIEW接口设计及实战案例,帮助开发者快速解决工业自动化中的条码打印兼容性与效率问题。

hill8的博客 999

LabVIEW与C#协同调用Bartender实现动态条码打印的实战指南

本文详细介绍了如何通过LabVIEW与C#协同调用Bartender实现动态条码打印的实战指南。针对工业自动化中的条码打印需求,提供了从环境配置、C#核心接口开发到LabVIEW调用的完整解决方案,有效解决了打印效果差、兼容性问题和动态数据绑定困难等痛点。

weixin_29273849的博客 578

使用C#开发COM+组件

一般来说,在IT技术界以及硬件产业,技术的更新换代速度非常得惊人,而惯例是所有的新技术都会遵循向下兼容的原则,但是.NET技术不仅仅做到了这一点,.NET甚至实现了相互之间的各自调用,这一点是非常难能可贵的。也就是说,不但我们可以在.NET组件中调用COM组件,同时也可以在COM组件中正常的调用.NET组件。这点带来的好处是显而易见的,一方面我们可以保持现有的技术资源,另一方面,在现有资...

aome1470的博客 277

BarTender 2016 与 SQL Server 2012 集成:实现 C# WinForm 动态标签打印的 4 个关键步骤

本文详细介绍了如何通过BarTender 2016与SQL Server 2012的集成,结合C# WinForm实现动态标签打印的4个关键步骤。从环境准备、模板配置到C#集成开发,再到企业级解决方案的增强,全面覆盖了工业自动化与物流管理中的标签打印需求,特别适合使用斑马打印机的企业环境。

weixin_33970449的博客 403

C#实战:如何用后台服务定时将SolidWorks图纸批量转成Web可预览格式(附完整代码)

本文详细介绍了如何使用C#构建高可靠的后台服务,实现SolidWorks图纸的自动化批量转换,使其可在Web环境中预览。通过MES系统集成、文件系统监控、SolidWorks API调用封装等核心技术,解决了实际部署中的命名映射、错误处理和性能优化等难题,并提供了完整的代码示例和运维监控方案。

weixin_29300931的博客 264

C# WinForm项目实战:BarTender自动打印贴纸全流程(含源码解析)

本文详细介绍了如何通过C# WinForm项目集成BarTender实现贴纸的自动打印全流程,包括环境配置、核心打印功能实现、批量打印与队列管理等高级功能。文章提供了完整的源码解析和实战案例,帮助开发者快速掌握自动化打印技术,提升制造业和物流行业的生产效率。

weixin_30300225的博客 427

C#集成BarTender实现自动化标签打印的3种高效方案(含完整代码)

本文详细介绍了C#集成BarTender实现自动化标签打印的3种高效方案,包括直接调用命令行、使用SDK API深度集成以及事件驱动的高性能打印服务。通过完整代码示例和实战经验分享,帮助开发者快速掌握自动列印技术,提升工业生产中的标签打印效率和准确性。

weixin_29306011的博客 198

从零到一:C#与Bartender的自动化打印与图像导出实战指南

本文详细介绍了如何利用C#与Bartender软件实现自动化打印与图像导出功能,涵盖环境配置、核心打印功能实现、高级图像导出技术及性能优化策略。通过实战代码示例,帮助开发者快速掌握模板打印和PDF导出等关键技能,提升企业级应用开发效率。

palm99的专栏 799

C#与CodeSoft实战:动态Label模板设计与批量打印标签

本文详细介绍了如何使用C#与CodeSoft进行动态Label模板设计与批量打印标签的实战操作。通过变量绑定和批量处理技术,大幅提升物流仓储、生产制造等场景的标签打印效率。文章包含环境搭建、模板设计、C#集成开发及常见问题排查等实用内容,帮助开发者快速掌握高效标签打印解决方案。

weixin_28672681的博客 401

VS2012+C#实战:5分钟搞定Bartender自动打印条形码(附完整源码)

本文详细介绍了如何在VS2012环境下使用C#编程控制Bartender实现工业级条码自动打印。从环境配置、模板设计到核心代码实现,提供了完整的解决方案,包括异常处理、性能优化和常见问题排查,帮助开发者快速构建稳定可靠的自动化打印系统。

weixin_30892037的博客 440

C#实现COM+

C# COM+编程指南

.NET框架是Mocrosoft公司为适应Internet发展与市场形势而提出的开发平台。C#是Mocrosoft公司为.NET框架框量身定的首选语言。本书读者概要地介绍了.NET框架和通用语言运行库的基本概念,进一步讲解了新的框架与已有的COM+(组件对象模型扩展)技术的互操作方法,即如何在COM+中使用.NET组件以及如何在.NET框架中使用已有的COM+组件;如何用C#语言创建全新的符合.NET规范的COM+组件这些组件可用于事物处理、安全、事件、对象共享、事件排队心脏远程处理。

MALTAB/Simulink与C#仿真交互与控制的交互平台搭建与源程序设计,可辅助设计相关软...

MALTAB/Simulink与C#仿真交互与控制的交互平台搭建与源程序设计,可辅助设计相关软件的设计,内容主要包括结合C#编写应用程序,在前台控制MATLAB/Simulink进行交互控制,实现Simulink系统模型仿真的配置与交互控制。MALTAB/Simulink与C#仿真交互与控制的交互平台搭建与源程序设计,可辅助设计相关软件的设计,内容主要包括结合C#编写应用程序,在前台控制MATLAB/Simulink进行交互控制,实现Simulink系统模型仿真的配置与交互控制。实时数据流处理是个技术活。

2504_94308238的博客 153

COMSOL电磁仿真-网格剖分-边界层

介绍COMSOL在低频电磁场中边界层网格的剖分方法。

奇妙水果的技术博客,欢迎交流技术~ 4483
上一篇: 有意思的成员变量
下一篇: 2012年上半年的系统分析师考试小结
「已注销」
博客等级 码龄25年 93粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值