c#消息队列应用程式 -2_c#应用
2008-02-23 05:46:02来源:互联网 阅读 ()
在这个数组内部,CWorker 类创建了 CWorkerThread类的一个实现版
本。CWorkerThread 类(将在下面讨论)是个必须继承的抽象类。导出
类定义了消息的处理方式:
aThreads = new ArrayList();
for (int idx=0; idx〈sfWorker.NumberThreads; idx )
{
WorkerThreadFormatter wfThread = new WorkerThreadFormatter();
wfThread.ProcessName = sfWorker.ProcessName;
wfThread.ProcessDesc = sfWorker.ProcessDesc;
wfThread.ThreadNumber = idx;
wfThread.InputQueue = sfWorker.InputQueue;
wfThread.ErrorQueue = sfWorker.ErrorQueue;
wfThread.OutputName = sfWorker.OutputName;
// 定义辅助类型,并将其插入辅助线程结构
CWorkerThread wtBase;
switch (sfWorker.ProcessType)
{
case WorkerFormatter.SFProcessType.ProcessRoundRobin:
wtBase = new CWorkerThreadRoundRobin(this, wfThread);
break;
case WorkerFormatter.SFProcessType.ProcessAppSpecific:
wtBase = new CWorkerThreadAppSpecific(this, wfThread);
break;
case WorkerFormatter.SFProcessType.ProcessAssembly:
wtBase = new CWorkerThreadAssembly(this, wfThread);
break;
default:
throw new Exception("Unknown Processing Type");
}
// 添加对数组的调用
aThreads.Insert(idx, wtBase);
}
一旦任何的对象都已创建,就能够通过调用每个线程对象的 Start方
法来启动他们:
foreach(CWorkerThread cThread in aThreads)
cThread.Start();
Stop、Pause 和 Continue 方法在 foreach循环里执行的操作类似。
Stop方法具备如下的垃圾收集操作:
GC.SuppressFinalize(this);
在类析构函数中将调用 Stop 方法,这样,在没有显式调用 Stop 方
法的情况下也能够正确地终止对象。假如调用了 Stop 方法,将无需析
构函数。SuppressFinalize方法能够防止调用对象的 Finalize 方法(析
构函数的实际实现)。
CWorkerThread 抽象类
CWorkerThread 是个由 CWorkerThreadAppSpecifc、CWorkerThread
RoundRobin 和 CWorkerThreadAssembly继承的抽象类。无论如何处理消
息,队列的大部分处理是相同的,所以 CWorkerThread类提供了这一功能。
这个类提供了抽象方法(必须被实际方法替代)以管理资源和处理消息。
类的工作再一次通过 Start、Stop、Pause 和 Continue 方法来实现。
在 Start方法中引用了输入和错误队列。在 .NET 框架中,消息由 System.
Messaging 名称空间处理:
// 尝试打开队列,并配置默认的读写属性
MessageQueue mqInput = new MessageQueue(sInputQueue);
mqInput.MessageReadPropertyFilter.Body = true;
mqInput.MessageReadPropertyFilter.AppSpecific = true;
MessageQueue mqError = new MessageQueue(sErrorQueue);
// 假如使用 MSMQ COM,则将格式化程式配置为 ActiveX
mqInput.Formatter = new ActiveXMessageFormatter();
mqError.Formatter = new ActiveXMessageFormatter();
一旦定义了消息队列引用,即会创建一个线程用于实际的处理函数
(称为 ProcessMessages)。在 .NET 框架中,使用 System.Threading
名称空间很容易实现线程处理:
procMessage = new Thread(new ThreadStart(ProcessMessages));
procMessage.Start();
ProcessMessages 函数是基于 Boolean值的处理循环。当数值设为
False,处理循环将终止。因此,线程对象的 Stop 方法只配置这一Boolean
值,然后关闭打开的消息队列,并加入带有主线程的线程:
// 加入服务线程和处理线程
bRun = false;
procMessage.Join();
// 关闭打开的消息队列
mqInput.Close();
mqError.Close();
Pause 方法只配置一个 Boolean 值,使处理线程休眠半秒钟:
if (bPause)
Thread.Sleep(500);
最后,每一个 Start、Stop、Pause 和 Continue 方法将调用抽象的
OnStart 、OnStop、OnPause 和 OnContinue 方法。这些抽象方法为实现
的类提供了挂钩,以捕获和释放所需的资源。
ProcessMessages 循环具备如下基本结构:
●接收Message。
●假如Message具备成功的Receive,则调用抽象ProcessMessage方法。
●假如Receive或ProcessMessage失败,将Message发送至错误队列中。
Message mInput;
try
{
// 从队列中读取,并等候 1 秒
mInput = mqInput.Receive(new TimeSpan(0,0,0,1));
}
catch (MessageQueueException mqe)
{
// 将消息配置为 null
mInput = null;
// 查看错误代码,了解是否超时
if (mqe.ErrorCode != (-1072824293) ) //0xC00E001B
{
// 假如未超时,发出一个错误并记录错误号
LogError("Error: " mqe.Message);
throw mqe;
}
}
if (mInput != null)
{
// 得到一个要处理的消息,调用处理消息抽象方法
try
{
ProcessMessage(mInput);
}
// 捕获已知异常状态的错误
catch (CWorkerThreadException ex)
{
ProcessError(mInput, ex.Terminate);
}
// 捕获未知异常,并调用 Terminate
catch
{
ProcessError(mInput, true);
}
}
ProcessError方法将错误的消息发送至错误队列。另外,他也可能引
发异常来终止线程。假如ProcessMessage方法引发了终止错误或 CWorker
ThreadException类型,他将执行此操作。
CworkerThread 导出类
任何从 CWorkerThread中继承的类都必须提供 OnStart、OnStop、On
Pause、OnContinue和 ProcessMessage 方法。OnStart 和 OnStop方法获
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇: c#消息队列应用程式 -1_c#应用
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash