<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-ipointer</title><link>http://www.cnblogs.com/ipointer/</link><description>给我最爱的宝宝</description><language>zh-cn</language><lastBuildDate>Wed, 20 Aug 2008 12:55:46 GMT</lastBuildDate><pubDate>Wed, 20 Aug 2008 12:55:46 GMT</pubDate><ttl>60</ttl><item><title>对Activity副本的再理解</title><link>http://www.cnblogs.com/ipointer/archive/2008/07/24/1250400.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 24 Jul 2008 04:21:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/07/24/1250400.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1250400.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/07/24/1250400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1250400.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1250400.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在看本文之前，先看WF大牛WXWinter的博文：<a href="http://www.cnblogs.com/foundation/archive/2008/06/05/1214783.html">http://www.cnblogs.com/foundation/archive/2008/06/05/1214783.html</a>，本人在看他的博文后，觉得还有一些点没有讲透，想通后，写下此文。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;重提一下WXWinter的博文：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;While与Replicator可以重复执行其子Activity，While与Replicator在每次重复使用Activity时，并不是将其重置到初始状态。而是克隆原始Activity，每个克隆的Activity都单独进行管理。不会干扰其他克隆的Activity。这些克隆的Activity每一个都要有自身的 AEC 来管理状态。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这段描述没有问题，有两点还没说清楚：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、克隆的Activity的可见性。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、在什么时候克隆Activity。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们从WXWinter的例二入手，例二没有达到预期目的的根本原因就是克隆的Activity的可见性。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例一中是在流程中给活动实例的MyProperty属性做++操作的，在流程中只能看到真正的Activity1的活动实例，是不可能看到活动的副本的，所以这里++操作就是针对真正的Activity1的活动实例的。而例二中，由于将给活动实例的MyProperty属性做++操作封到了ActivityLibrary里面，运行时++操作是针对活动的副本进行的，所以根本不会影响到真正的活动实例。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们经常要封ActivityLibrary的同志就要注意了，必须使用this.Parent.GetActivityByName(this.Name)才能取到真正的活动实例，GetActivityByName的作用是根据指定的类型名返回当前活动及其子运行活动的活动实例。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;问题二什么时候克隆Activity，在串行情况下，在每次执行序列之前克隆Activity，证据是在副本活动中用一下代码：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void codeActivity1_ExecuteCode(object sender, EventArgs e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Activity1 a1 = this.Parent.GetActivityByName(this.Name) as Activity1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a1.MyProperty++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(MyProperty);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以发现副本的MyProperty值也是变化的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在并行情况下就是在最初全部克隆好了。</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1250400.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41804/" target="_blank">[新闻]Google云计算服务系统本周严重崩溃</a>]]></description></item><item><title>Windows Workflow Foundation中实现人工活动的demo，按照XPDL规范的实现</title><link>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245397.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 17 Jul 2008 11:04:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245397.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1245397.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245397.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1245397.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1245397.html</trackback:ping><description><![CDATA[在XPDL规范中，一个人工参与的活动有以下特性：活动任务的多实例（根据活动上指定的参与者，分配活动任务，活动任务我们称为工作项），工作项的分配策略（ALL所有参与者分配和Radom随机挑选分配，当然还有更多的资源模式，因为是是demo就不实现了），活动的完成策略（ALL所有工作项完成活动才完成和ANY任意工作项完成即完成），工作项执行模式（并行和串行）。<br />
开始我的描述，下图是封好的组合活动，整个组合活动暴露的属性有：参与者（是个集合，可以自己定义组织模型接口，用户、岗位、用户组、组织等）、分配策略、完成策略、执行模式、预警规则等。<br />
<img height="589" alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/HumanActivity.JPG" width="421" border="0" /><br />
我们一一来看组合活动中的每个活动的作用：<br />
1、FindParticipant活动传入参与者列表和分配策略，经过对策略的不同处理（动态的参与者需要从上下文中获取），返回最终确定的参与者。<br />
2、ApprovalReplicator活动是ReplicatorActivity，这个是实现活动任务多实例的关键。将计算获得的参与者列表作为ReplicatorActivity的InitData，参与者列表的数量会决定整个ReplicatorActivity块的执行次数，每次会起单独的线程（通过观察ActivityExecutionContext的ID与父活动的不一样得知，异步线程的Context都是自己管理的），每个线程的初始数据即为具体的一个参与者。根据工作项执行模式是并行的还是串行的来设置ReplicatorActivity的ExecutionType属性。ReplicatorActivity的四个事件都很有用，为了初始数据和支持策略的实现，这里不赘述。再多说一句，WF设计器好像对IList类型的属性支持不好，实现中我都是手写代码绑定的这类参数，应该是个Bug。<br />
3、SingleApproval是封的组件活动，因为ReplicatorActivity里只能包含一个活动，所以必须封一下。<br />
4、CreateWorkItem根据线程拥有的参与者，在数据库中创建工作项。工作项概念在WF中没有，估计WF就不是为人工活动设计的。我们就将其设计为业务数据，可以在数据库部署上与WF默认提供的数据库分离。<br />
5、LintenForApproval+WaitComplete配合实现流程对用户完成工作项的等待。这里要注意的关键点是CorrelationToken的运用，目的是分清楚来自与宿主程序的完成工作项的事件到底要发给哪个线程。WF的这个设计还是与Biztalk一致的，需要有创建CorrelationToken的活动（本例中是CreateWorkItem），后续的活动（本例中是WaitComplete）标记为Follow这个CorrelationToken。CorrelationToken的OwnerActivityName的设置也是很关键的点，这种多线程的场景中，如果这个属性设置为SingleApproval就坏事了，这样每个线程的CorrelationToken还是区分不出来，这里的技巧是设为/Parent，由运行时指定为父活动，WF引擎是支持的。还有一点要提的是，需要使用CorrelationToken的这种活动引用的用户接口必须加上<font face="Verdana">CorrelationParameter</font>特性，这个Lab中都有，不赘述了。<br />
6、UserSolve活动就是根据用户完成工作项的执行情况（宿主程序在事件参数中传入用户执行结果）。<br />
7、DelayActivity根据传入的预警信息生成等待的时间，DefaultSolve即完成预警信息中指定的动作。<br />
8、还差一点就是完成策略还没有提到，这个是通过ReplicatorActivity的UntilCondition来实现的，只要这个条件计算的结果是true，那么整个ReplicatorActivity就结束，而丢弃其他未完成的线程，每个线程的结束都会触发这个条件计算的执行。剩下的策略规则就不难实现了，根据不同的场景堆代码吧。<br />
<br />
以上的组合活动来实现人工活动的要点有：<br />
1、处理好ReplicatorActivity活动<br />
2、Listen活动+HandlerExternalEvent活动的配合，CorrelationToken的设置<br />
完成这个demo后还觉得这样实现太过于啰嗦，真想用代码直接写个HumanActivity。对于上面的两个关键点的用代码实现的设想：<br />
1、ReplicatorActivity，我们用代码根据参与者列表起几个Thread的问题。<br />
2、Listen活动+HandlerExternalEvent活动，用WF的消息队列+书签的方式就可以搞定了，这个有疑问请看我前一篇博文。CorrelationToken我们写代码想这么搞怎么搞，哈哈！ 
 <img src ="http://www.cnblogs.com/ipointer/aggbug/1245397.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41805/" target="_blank">[新闻]张亚勤一改陈永正做法 微软举报洪磊为推广Vista</a>]]></description></item><item><title>WF消息队列的使用</title><link>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245297.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 17 Jul 2008 08:32:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245297.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1245297.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1245297.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1245297.html</trackback:ping><description><![CDATA[<div style="layout-grid:  15.6pt none">
<p><font face="宋体" size="2"><span style="font-size: 10.5pt; font-family: 宋体">工作流队列用于在宿主程序或工作流外部服务与工作流中的活动之间传递消息。</span></font><font face="Verdana"><span style="font-family: Verdana">WF</span></font><font face="宋体"><span style="font-family: 宋体">本质论里面写的很含糊，通过下面的例子可以很好的理解工作流队列的使用。</span></font></p>
<p><font face="宋体" size="2"><span style="font-size: 10.5pt; font-family: 宋体">例子主要功能是，一流程运行到</span></font><font face="Verdana"><span style="font-family: Verdana">ReadLine</span></font><font face="宋体"><span style="font-family: 宋体">活动处，等待用户在控制台的输入，如果用户没有输入，则流程会钝化，有一个书签（其实就是对事件的处理方法）会加到工作流队列的</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">QueueItemAvailable</span></font><font face="宋体"><span style="font-family: 宋体">事件上。</span></font></p>
<p><font face="宋体" size="2"><span style="font-size: 10.5pt; font-family: 宋体">下面首先看</span></font><font face="Arial"><span style="font-family: Arial">ReadLine</span></font><font face="宋体"><span style="font-family: 宋体">这个活动，解释看注释。</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">using System;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">using System.Workflow.ComponentModel;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">using System.Workflow.Runtime;</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">namespace EssentialWF.Activities {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp; public class ReadLine : Activity {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; private string text;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; public string Text {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return this.text; }</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p style="text-indent: 18pt"><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">protected override void Initialize(IServiceProvider provider) {</span></font></p>
<p style="text-indent: 18pt"><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">//</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">活动初始化时就用活动名字创建，不用担心多个实例间的重名情况，因为消息队列是跟着流程实例走的</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowQueuingService qService =(WorkflowQueuingService)provider.GetService(typeof(WorkflowQueuingService));</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!qService.Exists(this.Name))</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qService.CreateWorkflowQueue(this.Name, true);</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; protected override ActivityExecutionStatus Execute(ActivityExecutionContext context) {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowQueuingService qService = context.GetService&lt;WorkflowQueuingService&gt;();</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">尝试执行获取用户输入，如果有用户输入，</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">Dequeue</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">方法就能获取的到</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">并将活动的执行状态置为结束</span></font></p>
<p style="text-indent: 21pt"><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;WorkflowQueue queue = qService.GetWorkflowQueue(Name);</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (queue.Count &gt; 0) {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text = (string)queue.Dequeue();</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ActivityExecutionStatus.Closed;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;//</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">尝试执行没有成功，给队列的</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">QueueItemAvailable</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">事件（此事件会在消息入队列时触发）加上处理方法</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;//</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">并将活动的执行状态置为运行中</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queue.QueueItemAvailable += this.ContinueAt;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ActivityExecutionStatus.Executing;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">下面都很好理解了，不说了</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; void ContinueAt(object sender, QueueEventArgs e) {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActivityExecutionContext context = sender as ActivityExecutionContext;</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowQueuingService qService = context.GetService&lt;WorkflowQueuingService&gt;();</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowQueue queue = qService.GetWorkflowQueue(Name);</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text = (string)queue.Dequeue();</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.CloseActivity();</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; protected override void Uninitialize(IServiceProvider provider) {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowQueuingService qService = (WorkflowQueuingService)provider.GetService(typeof(WorkflowQueuingService));</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (qService.Exists(this.Name))</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qService.DeleteWorkflowQueue(this.Name);</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp; }</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">}</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体"><span style="font-size: 36pt; font-family: 宋体"><font style="font-family: " face="宋体" size="1"><span style="font-size: 9pt; font-family: ">再看我们的宿主程序怎么和</span></font><font style="font-family: " face="Arial" size="1"><span style="font-size: 9pt; font-family: ">ReadLine</span></font><font style="font-family: " face="宋体" size="1"><span style="font-size: 9pt; font-family: ">活动配合。</span></font></span></span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">string s = Console.ReadLine();</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">instance.EnqueueItem(&#8220;rl1&#8221;,s,null,null);//</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">这行代码就是向队列中加入消息，</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">rl1</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">是活动的名称，</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">s</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">是消息的数据信息，后两个参数是用于传递消息后接受反馈的通知。</span></font></p>
</div>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1245297.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41805/" target="_blank">[新闻]张亚勤一改陈永正做法 微软举报洪磊为推广Vista</a>]]></description></item><item><title>查数据库死锁的实际例子</title><link>http://www.cnblogs.com/ipointer/archive/2008/06/05/1214005.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Wed, 04 Jun 2008 16:23:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/06/05/1214005.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1214005.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/06/05/1214005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1214005.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1214005.html</trackback:ping><description><![CDATA[<p>一个项目上的数据库宕掉了，开始非说是我的工作流造成的。我也不是数据库的专家，只能硬着头皮边学边用的查了，怀疑是数据库死锁，就沿着这个方向前进。
<p>首先sa登录查询分析器，执行Dbcc traceon(1204, 3605, -1)，其中参数1204代表返回参与死锁的锁的类型以及当前受影响的命令，3605代表trace到的信息必须记录到日志中，-1代表返回当前所有打开的跟踪标记的状态。有几点要注意，1、事件探查器是跟不出死锁的sql的，因为它只是记录执行过的sql，而这些在事务里面死锁的sql都会被回滚的；2、只有在打开这些标记后数据库才会记录日志，打开这些标记会影响数据库性能，记得用完了使用Dbcc traceoff（标记号）关掉。
<p>接着就是再现这个死锁了，让实施人员在远程找5、6个人同时点这个功能，嘿嘿，不错，一下子就出来了。将数据库日志发过来，一般在Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\LOG\ERRORLOG下。打开文件仔细看发现下面的日志。
<p>2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node:1
<p>2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RID: 5:1:6815:21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CleanCnt:3 Mode:X Flags: 0x2<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Grant List 2:<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Owner:0x3711E420 Mode: X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Flg:0x0 Ref:1 Life:02000000 SPID:59 ECID:0 XactLockInfo: 0x387A26FC<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPID: 59 ECID: 0 Statement Type: DELETE Line #: 133<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Input Buf: RPC Event: Proc [Database Id = 5 Object Id = 1254295528]<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Requested By: <br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResType:LockOwner Stype:'OR'Xdes:0x533EBC80 Mode: S SPID:67 BatchID:0 ECID:0 TaskProxy:(0x1F092374) Value:0x2962ae40 Cost:(0/0)<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node:2
<p>2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY: 5:72057594056212480 (fc0199b9be7a) CleanCnt:2 Mode:S Flags: 0x0<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Grant List 2:<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Owner:0x2028AD80 Mode: S&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Flg:0x0 Ref:1 Life:00000000 SPID:67 ECID:0 XactLockInfo: 0x533EBCA4<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPID: 67 ECID: 0 Statement Type: SELECT Line #: 1<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Input Buf: RPC Event: Proc [Database Id = 5 Object Id = 484053356]<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Requested By: <br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResType:LockOwner Stype:'OR'Xdes:0x387A26D8 Mode: X SPID:59 BatchID:0 ECID:0 TaskProxy:(0x576FE374) Value:0x1eb9ad20 Cost:(0/84)<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Victim Resource Owner:<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResType:LockOwner Stype:'OR'Xdes:0x533EBC80 Mode: S SPID:67 BatchID:0 ECID:0 TaskProxy:(0x1F092374) Value:0x2962ae40 Cost:(0/0)
<p>Node1（SPID：59）拥有了一个资源的排他锁Mode: X ，而需要申请另一个资源的共享锁Mode: S，Node2（SPID：67）拥有了后一个资源的共享锁，请求前一个资源的排他锁。根据学校里的零星知识，还是能明白这个道理的。照理说这种情况是不会死锁的，但是如果在事务里，共享锁也会在事务结束以后才释放。
<p>联机丛书上有一些信息可以利用来看这段日志。
<h6>类型列</h6>
<p>"类型"列显示当前锁定的资源类型。
<p>资源类型<br />
描述
<p>RID<br />
用于锁定表中的一行的行标识符。
<p>KEY<br />
索引中的行锁。用于保护可串行事务中的键范围。
<p>PAG<br />
数据或索引页。
<p>EXT<br />
相邻的八个数据页或索引页构成的一组。
<p>TAB<br />
包括所有数据和索引在内的整个表。
<p>DB<br />
数据库。
<h6>资源列</h6>
<p>"资源"列提供有关正被锁定资源的信息。
<p>资源类型<br />
描述
<p>RID<br />
表内已锁定行的行标识符。行由 fileid:page:rid 组合进行标识，其中，rid 是页中的行标识符。
<p>KEY<br />
SQL Server 内部使用的十六进制数字。
<p>PAG<br />
页码。页由 fileid:page 组合进行标识，其中，fileid 是 <strong>sysfiles</strong> 表中的 <strong>fileid</strong>，而 page 是该文件内的逻辑页码。
<p>EXT<br />
正被锁定的扩展盘区中的第一个页码。页由 fileid:page 组合进行标识。
<p>TAB<br />
由于 <strong>ObjId</strong> 列已包含表的对象 ID，所以没有提供任何信息。
<p>DB<br />
由于 <strong>dbid</strong> 列已包含数据库的数据库 ID，所以没有提供任何信息。
<p>在 <strong>sp_lock</strong> 的结果集内，锁定的 RID 资源类型中的资源描述为 1:1225:2。这表明在 fileid 1 内、页码为 1225 的页中、行标识符为 2 的行上应用了锁。
<p>最关键的信息我认为是
<p>[Database Id = 5 Object Id = 1254295528]和[Database Id = 5 Object Id = 484053356]<br />
指明了加锁的两个对象。
<p>select&nbsp; db_name(5)&nbsp; 结果为 cwbase_zclzj<br />
连接 cwbase_zclzj帐套，<br />
select object_name(484053356)&nbsp; 结果为&nbsp; ： erp_LS_BillCodeRule_GenerateNewBillCode<br />
select object_name(1254295528)&nbsp; 结果为： erp_LS_BillFlowNoRecords_NewRecordSave
<p>原来是两个存储过程搞得鬼，在生成单据编号的时候出现了死锁，因为两者是放在同一个事物中，也就验证了我们上面的猜想。简单的处理办法是不要放到同一个事物中，其他的办法就让负责维护的同事去管吧。
<p>就写到这里，其实日志里面的大部分咚咚还是看不懂，等待高人给予解释。如果分析中有什么不对的，也请各位回复指出，我也进一步学习一下。谢谢！</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1214005.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41802/" target="_blank">[新闻]微软Office 14即将展开Alpha测试</a>]]></description></item><item><title>喜欢使用VMware的.net程序员要注意呀（Visual Studio启动不了的问题）</title><link>http://www.cnblogs.com/ipointer/archive/2008/05/27/1208276.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 27 May 2008 04:09:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/05/27/1208276.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1208276.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/05/27/1208276.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1208276.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1208276.html</trackback:ping><description><![CDATA[<font face="Verdana">VMware在安装的时候默认会在VS中装插件，VS启动时会去加载这些插件。<br />
VMware一共有四个服务，我们为了启动速度快一点，经常会停掉这些服务。而VS启动加载插件时如果这些服务是停止的，那么加载过程就会停在那里，就像我们看到的一直停留在启动画面的情况。<br />
解决方法：1、将这些服务的启动类型设为自动。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、将注册表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\AddIns\VMDebugger.Connect目录下把LoadBehavior项改为0，反正我们基本不会去用到这些插件。<img src="http://www.cnblogs.com/Emoticons/msn/regular_smile.gif"  alt="" />&nbsp;&nbsp;</font>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1208276.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41801/" target="_blank">[新闻]《星际争霸2》新图</a>]]></description></item><item><title>编译器错误信息: CS1595: 已在多处定义“ ”；一种可能出现的情况</title><link>http://www.cnblogs.com/ipointer/archive/2008/03/29/1129218.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Sat, 29 Mar 2008 13:43:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/03/29/1129218.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1129218.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/03/29/1129218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1129218.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1129218.html</trackback:ping><description><![CDATA[先说一下网上经常能搜到的情况。<br />
<font face="Verdana"><a href="http://liubiqu.cnblogs.com/archive/2004/11/30/71025.aspx">http://liubiqu.cnblogs.com/archive/2004/11/30/71025.aspx</a></font> 这个说了两种情况，方法 1：在 C# 编译器定义中包括 /nostdlib 选项；方法 2：为 ASPNET 帐户授予列出权限。可以参见一下。<br />
还有就是说把命名空间改掉，<font face="Verdana">http://www.cnblogs.com/zgqys1980/archive/2006/08/16/478414.html</font><br />
但对于我的情况都不适用。<br />
<br />
我的情况是运行时ieWebControl出现多处定义，并不是编译时。<br />
开始想不通，这个多处定义是怎么来的，做了一些尝试，如：重装这个控件，删除ASP.NET的临时文件，重启iis，都不管用。<br />
最后还是着眼于ASP.NET的查找dll的方式，大家都知道ASP.NET运行时的dll都是在临时文件夹（%Windir%\microsoft.net\framework\{<font face="Verdana">version</font>}）,而这里面的dll都是从GAC和Web应用程序根目录下Copy过来的。这样就想到是不是这两个地方都有这个dll呢，证实是这样的，而且版本还不一样，这就造成了运行时的多处定义。ps：Web程序和WinForm的加载dll的方式不一样，WinForm肯定是首先找GAC，再找运行目录或根据配置文件找，所以WinForm程序运行时不会出现这样的问题。结果就是删掉Web应用程序根目录下的这个dll，就正确的，也不知道哪个鸟人拷进去的。<img src="http://www.cnblogs.com/Emoticons/msn/confused_smile.gif"  alt="" />
<img src ="http://www.cnblogs.com/ipointer/aggbug/1129218.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41800/" target="_blank">[新闻]Google放出Android开发路线图</a>]]></description></item><item><title>BPM业务场景分析（1）——内部交易合并开票</title><link>http://www.cnblogs.com/ipointer/archive/2008/03/25/1121385.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 25 Mar 2008 07:43:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/03/25/1121385.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1121385.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/03/25/1121385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1121385.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1121385.html</trackback:ping><description><![CDATA[上篇的姊妹篇，上个系列是由工作流模式推业务场景，而本系列是由业务场景推运行时实现，都是头脑风暴的总结，不都是正确的，欢迎大家指正问题。<br />
<p>（1） 描述
<p>内部交易流程，完成了整个业务过程之后是集中开票的过程。开票操作是批操作，至于哪些放到一批里面，这个规则不确定，可能由人决定，可能是一个月开一次票。
<p>单纯的从业务发生发展角度来看，内部交易完成以后就应该是开票，以上的业务流程图很简单，如下：
<p><a href="file:///C:/Documents%20and%20Settings/zhujch/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/2aab81c2-10d5-467d-874f-cba1bd3c7d0b/clip_image002[3].gif"></a>&nbsp;<span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<img height="54" alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/BPM1.JPG" width="224" border="0" /></v:shapetype></span>
<p>展开来看，想要达到的运行效果类似于下图：
<p><a href="file:///C:/Documents%20and%20Settings/zhujch/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/2aab81c2-10d5-467d-874f-cba1bd3c7d0b/clip_image004[4].gif"></a><img height="164" alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/BPM2.JPG" width="368" border="0" />&nbsp;
<p>（2） 解决方案
<p>a、 将内部交易和集中开票分到不同的业务流程上，本来这者就没有太紧密的联系，因此分到两个业务流程上也很自然。实现方式上，内部交易流程实例正常结束，之后由人参与决定哪些数据集中到一张发票上，激活开票流程。为了流程回溯，在数据汇合的时候应该记录内部交易流程和开票流程之间的关系。这种方案适用于内部交易流程和开票之间没有固定规则，需要人参与的场景。
<p>b、 用多实例模式中的在运行时都不确定执行次数的方式来实现这个流程，内部交易流程是一个可重复执行的活动块，这个活动重复执行的次数是在运行时外部事件决定的，可能是时间，也可能是人参与产生的事件。如，在某些管理方法中是月结的，即是由时间作为外部事件，下图描述了这种情况。
<p><a href="file:///C:/Documents%20and%20Settings/zhujch/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/2aab81c2-10d5-467d-874f-cba1bd3c7d0b/clip_image006[4].gif"></a><img height="105" alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/BPM3.JPG" width="528" border="0" />&nbsp;
<p>上图的流程的启动条件是每月月初，并使能重复执行Scope块活动，每个内部交易开始激活一个执行线程，此内部交易流程结束后，整个Scope块活动仍然处于使能状态，直到结束条件&#8216;时间到月末&#8217;成立，整个Scope块活动结束，然后进行集中开票。
<p>（3） 含义引申
<p>从上面的两个解决方案引出了一个问题，什么样的流程环节应该画在一个流程里面，而什么样的应该分开，这个是不是有选择的标准？是根据实施人员的经验来进行判断？那么两个不同水平的实施人员所定制的流程的可用性将有天壤之别。目前总结的标准或者说是策略包括：
<p>a、 流程描述、展现的含义是不是清楚。在特定流程定制工具的约束下，是不是能表达出流程的本义。
<p>b、 数据转换存不存在问题。在一个流程中，这个肯定不是问题，而分开了可能就有问题。
<p>c、 流程回溯、数据跟踪的方便性，同上面一条的道理。
<p>除了上述的选择标准的问题，还有一个问题不得忽视。如何保持流程之间的串联性，说白了就是如果是自动激活了流程，如何通知这个流程启动，而如果是由人激活的流程，那么如果去通知这个人。自然的联想就是通过消息中间件，其特征必须具备传达的可靠性、大吞吐量和回馈的准确性。微软的建议是使用Biztalk，那么就在这种假设下构建了如下的业务流程图。
<p><a href="file:///C:/Documents%20and%20Settings/zhujch/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/2aab81c2-10d5-467d-874f-cba1bd3c7d0b/clip_image008[4].gif"></a><img height="176" alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/BPM4.JPG" width="375" border="0" />&nbsp;
<p>上图表达了粗粒度的业务流程图，图中每个方块代表的是一个模块内的流程，而模块间的流程的互操作性由Biztalk的能力提供，主要依赖强大的Mapping做数据转换、抓取数据的BAM用来做数据跟踪、消息中间件的能力。
<p>另一个问题是业务流程划分的力度不能过小，如果还是以一个功能点为一个业务流程的话，又回到了目前功能驱动的情况了。</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1121385.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41799/" target="_blank">[新闻]番茄花园作者被警方逮捕</a>]]></description></item><item><title>高级工作流模式深入业务场景分析（1）——多路合并</title><link>http://www.cnblogs.com/ipointer/archive/2008/03/24/1119962.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 24 Mar 2008 08:59:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/03/24/1119962.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1119962.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/03/24/1119962.html#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1119962.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1119962.html</trackback:ping><description><![CDATA[<p>开篇之作
<p>（1） 描述
<p>两条或更多的分支合并到单一的一条后续路径中，每一条使能进入分支都激活后续路径的一次执行线程。虽然多条分支在图形上是合并的，但是这个多路合并并不对这些分支激活的后续线程进行任何的同步。
<p>（2） 抽象模型描述
<p><a href="http://www.workflowpatterns.com/patterns/control/advanced_branching/wcp8_animation.php">多路合并的Flash动画</a>
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hyBlR6kDLzGkhlqVfvdRf4ueMMjUcHfH0q3N_xAhdih1tIkrxlhj9zLLdrSlQ-AALA?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="134" alt="clip_image002" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hyacxbxNO1yYkNJ72nYCTAU1mWOw6okoa2mVSh8jRtbSZu0DqA2Gua-3raIl66_N1U?PARTNER=WRITER" width="456" border="0" /></a>
<p>上图中，B和C是多路选择后的分支，这样的分支可以超过两个，假设还有E、F&#8230;&#8230;，这样的分支在多路选择处不进行同步，每一个分支都会激活一次D的执行，即D（B）、D（C）、D（E）&#8230;&#8230;，并且这些D的线程互不干扰。
<p>（3） 业务场景举例
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hzvOsfDCaZPoqlAj0xmOePmaUTzMmGifHzu8yFeTY0iOCv1T0WOz-eS-uVcAyhXgYE?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="197" alt="clip_image004" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hzUZsI8pqRT0e-WbVjcR21x7AwJBNdZrckmgHykXjhkh11z9kqO7o6oiI_ABFURUD0?PARTNER=WRITER" width="460" border="0" /></a>
<p>报销流程，假设分为三部分：住宿费、交通费、飞机票特殊报销。可能出现的情况有：住宿费+交通费；住宿费+交通费+飞机票特殊报销；交通费；交通费+飞机票特殊报销&#8230;&#8230;
<p>流程开始，首先填写报销申请（勾选报销的内容，三种费用中选择），之后流程根据勾选的内容激活后续的填写不同报销单的分支，最后每一张报销单都需要经过审批。
<p>如果流程引擎没有实现多路合并我们可以变相的实现上面的功能。如下图：
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hz61C3PIQSTYLd8ZnrWRotBQgg-wUbeSKhiw5QwUAw6Mh4sHHyGGh8cQt8K9-furFU?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="199" alt="clip_image006" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hxIQmH5fpd6Q6ABK3WQOaYzeFlzr55WhQ4mMmRoeVk2u-hfDyU9JVfJRpkhFt9id8E?PARTNER=WRITER" width="528" border="0" /></a>
<p>但上述的实现有以下的不足：
<p>a、 重复工作量，审批分明是同一个活动，非要分多个来画；
<p>b、 无法进行统计，若要对审批这一活动的时间、数量等信息进行统计分析，那么分成了多个活动后就难于进行统计。
<p>c、 资源的分配，假设审批是由一个岗位来负责，且任务压力应该在这个岗位上负载均衡，那么分成了多个活动后这个资源的分配也无从着手。
<p>（4） 含义引申
<p>多路合并的后续路径，是一些相同行为的执行线程，这就类似于另外一种模式——多实例模式。这些线程终有一个需要同步的时候，在业务场景中，这个同步就非常的复杂，如后续步骤为制证，这种业务可以分为以下情况，我们一一举例说明：
<p>a、 强制一对一：一个审批后的单据生成一个财务凭证，那么这些多实例的线程暂时不同步，留到后续步骤。这种管理方式是比较常见的。
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hwPb46KdkOfLpjA9h6P4sq0wB368HCtLnFaKF_JaZCMBFu5lbf9UTba3kDEH3DanRQ?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="63" alt="clip_image008" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hxo6ts5qomkDxGR_7_BFEdzsyxAjia2g_Zduvp1pA34MfxD85zaUpJ93M5JCTBXSzY?PARTNER=WRITER" width="476" border="0" /></a>
<p>b、 强制多对一：同一个报销申请产生的报销单据，需要生成在一个财务凭证上。因此在制证前就需要同步。这种管理方式是比较常见的。
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hxICm1Mkn0gEHMsEEtLNdIxcJH1phrCqJGJiKWnBjMlDR3e717efm0RSvpphuNCPoE?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="63" alt="clip_image010" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hyUnCF_1GQjHWd2Fwr_yWOgcXPi5mTfF9XR_lSTYegCHTcuZnNWTRp4FxCzaK-DRfA?PARTNER=WRITER" width="477" border="0" /></a>
<p>c、 任意多对多：在本场景中，这个不太可能发生，但在一般的物流业务中却非常常见。假设飞机票的审批比较严格，拖得时间比较长，另外两个报销单早批了，那么先将这两个生成同一个财务凭证。这种任意性的规则，一般都是通过人来判断的。
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hxS4FUaqmpcci8Py_YWwnj5cEdgqk2O1RarItZtS23IXcB8eq71p_LhH2yQftgHBPo?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="63" alt="clip_image012" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hzqh3Y8pnDFAl0d7ZvuwayI9nZuivDMUCtqez6iYlhNBr3dQelBWAlhaB2CVw3cJxE?PARTNER=WRITER" width="477" border="0" /></a></p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1119962.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41792/" target="_blank">[新闻]WordPress和Movable Type影响社交网站的未来</a>]]></description></item><item><title>工作流系统中增加“业务活动”这一概念的想法</title><link>http://www.cnblogs.com/ipointer/archive/2007/10/25/936779.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Wed, 24 Oct 2007 19:06:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2007/10/25/936779.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/936779.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2007/10/25/936779.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/936779.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/936779.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">什么是&#8220;业务活动&#8221;，我认为是对活动在业务层面上的更高的抽象，就好像我们提面向对象时将子类的公共方法提取到抽象类中一样，我们将活动在业务上的公共提取到&#8220;业务活动&#8221;上。&#8220;业务活动&#8221;建立在&#8220;业务流程&#8221;之下，是对流程更细一层的业务抽象。一个&#8220;业务活动&#8221;可以对应一个具体流程中的多个相同业务概念的活动，也可以对应在同一&#8220;业务流程&#8221;下的多个具体流程中同一业务环节的多个活动。</span>
<p style="text-indent: 21pt"><span style="font-family: 宋体">这样我们在为业务流程建模时，首先是定义&#8220;业务流程&#8221;，其次应该是识别流程中有哪些&#8220;业务活动&#8221;，并为&#8220;业务活动&#8221;定制一些属性，最后才是定义具体的流程。使用一套已经建立好了的&#8220;业务流程&#8221;来定制流程就变得非常的轻松，流程上关联业务流程，活动上关联业务活动，这样所有与业务相关的属性就都可以设置好。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">先前版本的工作流将活动上不管是与业务相关的，还是与流程相关的属性一齐混杂在流程设计器上。这种实现方式有几大弊端：</span>1<span style="font-family: 宋体">、无法实现同一业务概念的复用，在一个活动上定的业务概念，需要在另一个相同业务意义的活动上原封不同的重定一遍。虽然我们实现了活动的复制，但我认为这种复制不是解决这种业务意义复用的很好方式。</span>2<span style="font-family: 宋体">、所有的与业务相关的实体都是独立于工作流系统之外的，在定义流程时将这些业务实体的设置记录在流程定义中。由于流程的版本控制，先前已经运行的流程定义是无法改变的，而业务实体又可能是会发生变化的，如单据的字段权限变化了（对于自定义表单这样生来就是为适应变化的，就更容易发生变化了），构件的参数又增加了一个等等，致使流程运行时业务上的改变得不到及时的体现，甚至运行不下去。</span>3<span style="font-family: 宋体">、流程运行结果，更通俗的讲可能是审批的结论、意见不能根据业务意义进行分类，明显的体现是审批结果打印时，所有的意见结论都罗列在一起（这个需求来源于</span>OA<span style="font-family: 宋体">项目组）。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">哪些活动属性应该放到&#8220;业务活动&#8221;上，我认为表单定义、表单权限设置（动作权限、字段权限），其他象外部工具、规则等也可以考虑放进来。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">工作流可以无区别的对待普通流程和</span>OA<span style="font-family: 宋体">使用的动态流程的权限设置，都包括表单参数设置、表单动作权限的设置、表单字段权限的设置。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">值得一提的是，像加签、会签、跳转等权限，我认为是纯粹的流程权限，不应该去表单的权限混为一谈，可以强制识别这些的流程引擎提供了的流程动态功能，并为其设置权限。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">对特殊性、向下兼容的考虑，在流程定义上仍然保留这些在&#8220;业务活动&#8221;添加的属性，在使用时首先查找具体活动上的定义，再查找业务活动上的定义。这样的同一&#8220;业务活动&#8221;对应的活动也可以有完全不同的特性，而且对于老版本的流程定义，即使没有在活动上关联业务活动，仍可以正常运行。</span></p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/936779.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41791/" target="_blank">[新闻]谷歌平台手机获准上市</a>]]></description></item><item><title>回发或回调参数无效。在配置中使用...pages enableEventValidation="true"/&gt;</title><link>http://www.cnblogs.com/ipointer/archive/2007/07/06/807989.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 06 Jul 2007 01:21:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2007/07/06/807989.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/807989.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2007/07/06/807989.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/807989.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/807989.html</trackback:ping><description><![CDATA[<p>今早给客户解决了个问题，问题<span>是回发或回调参数无效。在配置中使用&lt;pages enableEventValidation="true"/&gt;。<br>google了一下，网上有两种说法：<br>1、把&lt;pages enableEventValidation="true"/&gt;改成&lt;pages enableEventValidation="false"/&gt;就好了。<br>2、把web.config中的globalization元素的requestEncoding和responseEncoding属性都改成utf-8。<br><br>解决问题的时候两种方法都试过了，都没有用，最后发现是客户机器上装了.net framewoke2.0，如果装1.1的程序会将站点建成2.0的，把这里改过来就可以了。<img height=20 src="http://www.cnblogs.com/Emoticons/QQ/14.gif" width=20 border=0></span></p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/807989.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41790/" target="_blank">[新闻]微软自称传媒公司 强调搜索引擎三大趋势</a>]]></description></item><item><title>转我们经理的一篇文章，业务流程实现的讨论，希望大家集思广议。</title><link>http://www.cnblogs.com/ipointer/archive/2007/05/29/764045.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 29 May 2007 07:53:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2007/05/29/764045.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/764045.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2007/05/29/764045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/764045.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/764045.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 现在搜一下业务流程管理，信息很多，也有很多产品号称是业务流程管理系统，但是在我看来，根本不是那么一回事，只能说某些产品只是实现了一个业务流中的某一个片段，如审批流、状态机、一个单据的流程。
<p>&nbsp;&nbsp; 想实现多个单据，如从申请、订单、发票、提货、出库、凭证一个完整的流程怎么办呢？怎么来用业务流管理起来。业务流系统的特点是根据规则系统自动分配任务，参与流程的人来完成任务。这个特点要求业务流的规则是可以定义和预见的。但是实际业务又要求，后续的业务只有在业务发生之时才能决定。这里面就存在一个矛盾，怎么解决这个矛盾呢。</p>
<p>&nbsp;&nbsp; 首先想到的是业务流的流程实例的拆分和合并，流程是跟业务对象实例一一对应的，业务流中的业务对象有很多种，每种业务对象的实例之间存在拆分和合并的可能。如果对象实例数据合并了，则流程实例也需要合并；如果对象实例数据拆分了，流程实例也需要拆分。</p>
<p>&nbsp;&nbsp; 第二个想到的办法是，将实例的明细数据启动一个流程实例，这里仍需要解决一个问题，那就是各个环节的处理是以一个业务实例为单位的，将明细数据对应一个流程实例，需要提供组处理的功能，即一组任务项合并为一个任务，处理这个任务就完成一批任务。</p>
<p>&nbsp;&nbsp; 第三个办法就是不使用业务流的原理来处理。即一个单据的完整流程使用业务流系统，几个单据之间使用的是集成流，利用集成的方式来处理几个单据之间的流转。</p>
<p>&nbsp; 虽然办法有很多，但是那种是最好的方式呢？</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/764045.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41789/" target="_blank">[新闻]亚洲社交网站Friendster将兼容竞争对手窗件</a>]]></description></item><item><title>维护旧版本项目的一些方法</title><link>http://www.cnblogs.com/ipointer/archive/2007/03/28/690612.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 27 Mar 2007 16:45:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2007/03/28/690612.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/690612.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2007/03/28/690612.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/690612.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/690612.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天碰到一个比较棘手的问题，一个做了2年多的项目上反映了一个问题，问题比较简单，但是涉及改动的dll引用的dll非常多，而且项目上的版本已经很旧了，这一处的改动会影响到几乎所有的dll的更新。单独更新这个dll是不可能了，也不能做完面的版本升级（公司的规定，可能升级是要花钱的，呵呵），而且vss中也清过了，没有留当时的代码。如果dll也能像asp页面一样直接修改，保存后就运行就好了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查了下资料，发现两种方法：（1）使用ildasm和ilasm两个自带的工具，加上IL（2）使用.NET Reflector插件FileDisassembler还原代码，重新编译。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先说一下第一种方法，使用ildasm打开项目上发过来的dll，在file下有dump菜单（如果是中文版就是文件下的转储菜单），弹出新窗口确定即可，生成后缀为.il的文件。下面就需要懂一点il语言，以前一直认为学习这个il语言没什么用，今天只能现学一把，因为问题比较小，4、5行就搞定了。保存之后，使用ilasm重新编译这个il文件。使用命令如ilasm.exe GSP_WorkflowEngine.il /dll /output=GSP_WorkflowEngine.dll，就OK了。不过在写il的时候还是碰到了很多问题，一直编译出错，还是il没有写好，看来学习il还是很多好处的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二种就是使用.NET Reflector插件FileDisassembler，先把这个插件下好挂上，菜单中就会出现FileDisassembler这个菜单项，打开要反编译的dll，就可以生成出源码，即使用了混淆器，要修改的问题也很容易找到，毕竟我们对自己的代码还是很熟悉的。重新建解决方案，添加需要引用的dll，重新编译就OK了。<br></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 写在最后，这两种方法本质上原理是一致的，我个人觉得，如果对il掌握的非常好的话，第一种方法是非常爽的，即使是在项目现场，对一些小问题修改都是相当轻易的。由此还想到.net的安全性，对于非强命名的dll来说，这种il级别的修改都是有效的，但对于软件的保护是相当不利的，我们是很容易从il中找到验证正版的代码信息，直接去掉，重新编译就破解了；对于入侵者来说，也是很容易修改系统上.net程序的运行方式的。</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/690612.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41788/" target="_blank">[新闻]百度宣布服务器全面换装闪存 替代硬盘</a>]]></description></item><item><title>OutLook解析邮件头的问题</title><link>http://www.cnblogs.com/ipointer/archive/2007/03/13/673721.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 13 Mar 2007 15:33:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2007/03/13/673721.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/673721.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2007/03/13/673721.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/673721.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/673721.html</trackback:ping><description><![CDATA[客户反映我们的邮件提醒中，显示的发送时间不对，而且相差的非常的大，如下图：<img src="http://www.cnblogs.com/images/cnblogs_com/ipointer/ee.JPG" border=0><br>左下角是用DateTime.Now打出来的正确时间，而右上角是OutLook解析邮件头显示出来的时间。<br>看到这个问题，觉得相当的奇怪，因为邮件头里我也是用WriteString(ns, "Date: " + DateTime.Now);往流里面写的呀，怎么会出来这么一个奇怪的时间呢？<br>开始是怀疑客户那里的应用服务器的时间出了问题，可几经确认，发现确实不是这个问题。<br>难道是邮件头里还隐藏着什么时间吗，可拿OutLook正常收到的邮件头和我们自己发的多次比较也没有发现什么问题，这个问题真是太奇怪了。<br>转而求助Google，也没有发现相关的文章；求助微软的老马，他只是指点可能时区出了问题。反复检查服务器上的时区，也没有问题。<br>郁闷之时，用FoxMail收了一下我们发的邮件，竟然正常，开始怀疑是微软小小的bug。<br>但还是定位不出问题，情急之下，胡搞乱搞，改了一下系统日期，调成了2006年，发现那个错误的日期也变成了2006-1-3。再观察邮件头，发现Date字段也变成了2006，于是问题还是出在了这个Data字段上。<br>再仔细比较我们的邮件头和正常的邮件头，发现了一点区别：<br>正常的是：Date: Tue, 13 Mar 2007 23:09:10 +0800<br>我们的是：Date: 2007-3-13 23:08:22<br>hoho，原来是OutLook解释不了这样的时间格式呀，于是修改代码成：<br>WriteString(ns, "Date: " + DateTime.Now.ToString("r"));<br>问题搞定！<br>这个被客户骂死的小问题拖了一两个月（嘻嘻，因为觉得不是大问题，也确实不知道怎么弄），终于找到原因了，庆祝一下。
<img src ="http://www.cnblogs.com/ipointer/aggbug/673721.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41787/" target="_blank">[新闻]诺基亚发布奢华碳纤维版8800 Arte</a>]]></description></item><item><title>MS DTC简述</title><link>http://www.cnblogs.com/ipointer/archive/2006/09/29/518490.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 29 Sep 2006 09:38:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2006/09/29/518490.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/518490.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2006/09/29/518490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/518490.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/518490.html</trackback:ping><description><![CDATA[<p>刚刚看了关于MS DTC的文章，明白了一点。下面摘录一点。<br>MS DTC即为Microsoft Distributed Transaction Coordinator (MS&#174; DTC) 。</p>
<p><span class=90v>在 MS DTC 术语中，执行者被称为事务管理器。在执行事务保护资源的事务中，其参与者（如关系数据库）被称为资源管理器。<br><br><span class=90v>应用程序对每个资源管理器的第一次调用确定应用程序的当前事务。例如，如果应用程序在使用关系数据库，它会调用 ODBC 接口，此接口将事务对象与 ODBC 连接关联起来。在此之后，所有通过此连接的数据库调用都会代表该事务执行，直到该事务结束为止。<br></p>
<p><span class=90v>当某个资源管理器首先代表某个事务工作时，会通过调用事务管理器&#8220;登记&#8221;到该事务中。随着事务的发展，事务管理器会跟踪每个登记到该事务中的资源管理器。</span></p>
<p><span class=90v>通常，应用程序用 Commit 事务方法来完成事务。如果应用程序无法完成，则调用 Abort 事务方法，该方法可以撤消事务的操作。如果应用程序失败，MS DTC 就会放弃此事务。<br></p>
<p><span class=90v>当应用程序成功地完成事务的工作后，它会调用 MS DTC 来&#8220;提交&#8221;事务。然后 MS DTC 会仔细检查&#8220;两阶段&#8221; &#8220;提交协议&#8221;，使所有已登记的资源管理器都提交。两阶段提交协议可确保所有的资源管理器提交此事务，或全都放弃此事务。在第一阶段，MS DTC 询问每个资源管理器是否&#8220;准备&#8221;提交。如果所有参与者都回答&#8220;是&#8221;，那么在第二阶段 MS DTC 将向所有参与者广播提交信息。如果事务的任何部分失败，或资源管理器响应准备请求失败，或资源管理器响应&#8220;否&#8221;，那么 MS DTC 将通知所有资源管理器该事务已被放弃。</span></p>
</span></span></span>
<img src ="http://www.cnblogs.com/ipointer/aggbug/518490.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41783/" target="_blank">[新闻]微软披露Windows 7功能开发团队名单</a>]]></description></item><item><title>图中跳转问题</title><link>http://www.cnblogs.com/ipointer/archive/2006/04/03/365394.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 03 Apr 2006 03:02:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2006/04/03/365394.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/365394.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2006/04/03/365394.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/365394.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/365394.html</trackback:ping><description><![CDATA[<p>问题描述：在有向图中，有唯一的开始节点和结束节点。图中节点的分叉和汇合有两种类型AND和XOR，分叉的时候为AND时，流程会流入下面所有的分支，为XOR只留向其中一条分支；汇合的时候，AND表示所有汇入的分支都已汇入流程才能继续，XOR表示一条汇入流程就继续。如果能从开始节点出发，正确的到达结束节点，那么这个流程就是正确的。<br>现在的问题是流程的节点之间需要跳转，即流程不按正常的流向进行，而是跳向指定的节点，先如何通过算法算出有向图中从某节点可以向的节点集合。<br><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/jumptest.JPG" border=0><br>解决思路：<br>1、使用有向图的化简，有两种局部可以化简，从一个节点到另一个节点间没有分叉和汇合，那么这两个节点可以化简为直接连接；如果从一个节点到另一个节点间经过m个分叉和n个汇合，假设m&gt;n,那么局部可以化简为m-n个分叉和一条直接的连线。将图化到最简，最后比较容易判断节点间是否可跳。<br>2、通过模拟运行的方式，将要跳出的节点的迁移从图中去掉，加上从跳出节点到跳入节点的迁移，模拟让流程运行一下。看流程是否正确。<br>存在的问题：方法一碰到及其复杂的流程无法处理，不能判断是否能化简；方法二，无法判断流程没有运行下去的原因，是上面有节点未完成，还是流程确实存在问题，无法运行下去。<br>请教各位有没有更好的办法，或是成型的算法来解决这个问题。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/365394.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41782/" target="_blank">[新闻]谷歌Android SDK软件界面浮现</a>]]></description></item><item><title>我们也要毕业了</title><link>http://www.cnblogs.com/ipointer/archive/2006/01/05/311769.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 05 Jan 2006 10:22:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2006/01/05/311769.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/311769.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2006/01/05/311769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/311769.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/311769.html</trackback:ping><description><![CDATA[<DIV>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">昨晚，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">k</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">一本叫&#8220;理工大风流史&#8221;的校园小说到两点，终于</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">k</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">完。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">我不是一个矫情的人，但不由要写下下面一段矫情的文字。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">小说前面都是风平浪静，如同所有校园小说一样，笑料</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">+</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">爱情</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">+</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">暴力</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">+</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">边缘性描写，怀疑现在的大学校园怎么都在走&#8220;蛊惑仔&#8221;的路线。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">但最后毕业告别和无言的结局，还是在我心里搅和一下。&#8220;窗外，一张破旧的床单上几个大字，一起走过，在夏雨里浸开了墨迹&#8221;、&#8220;临行，为了逃避送站的痛苦，趁兄弟们熟睡时就悄悄地走了，只在美女墙画上留下，保重，和歪歪扭扭的签名&#8221;，联想到的就是网上颇为流行的毕业图组，此时，另一更强烈的念头滑过，&#8220;我们也要毕业了&#8221;，顿时酸楚。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">黑暗中，胡乱的从桌上抓起</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">zippo</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">，让醇香的烟气走过喉咙，填补此刻的苍白。寂静的夜里，谁会在意一个大男孩的心声。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">思绪不由飘到了千里之外的丁香校园，那里恐怕已是白雪皑皑了，而哥们们已是散落在天涯，我的大学生活好像也是刚刚开场就荒诞的谢幕了。可爱的超超估计还在为考研忙得焦头烂额；婆婆妈妈的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">ken</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">还能在珠海沐浴和煦的海风；油光满面的睿睿在伟大首都孕育做官的美梦；老鼠估计还在骗人的中兴软件煎熬度日；红过脖子的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">DKF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">，差不多能满足当上他外国新娘的愿望；当然不能忘怀的还有那份已经飘散的爱情。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">小说自然是高于生活，我们的大学生活也可以拿出来试比高。我们的寝室翻不出</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">c cup</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">和</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">taotao</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">，却也有成堆的臭袜子和肥硕的小强；我们没有方桌上成宿的扑克麻将，却也有水房洗衣机上熬夜赶程序，贩卖机里驮来夜宵，兄弟们共饮；我们没有草丛树林的风流韵事，却也有</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">99</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">多青涩的玫瑰；我们没有打架斗殴，却也有众志成城拿下篮球赛；我们没有网吧里数以月计的传奇奇迹，却也有</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">KTV</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">里的烂醉如泥&#8230;&#8230;</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体"><FONT size=3>回首过去，我们一起走过，我小心翼翼的将记忆收起；而面对未来，没有了朝夕相处的兄弟，该往哪里去，我无言以对。</FONT></SPAN></P></DIV><img src ="http://www.cnblogs.com/ipointer/aggbug/311769.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41781/" target="_blank">[新闻]谷歌生活搜索增加“影讯”</a>]]></description></item><item><title>逻辑设计的例子</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/29/307405.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 29 Dec 2005 06:24:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/29/307405.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/307405.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/29/307405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/307405.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/307405.html</trackback:ping><description><![CDATA[摘要:  开发团队使用前期的使用场景定义对象和之间的关系、行为和属性（attribute）。团队要做以下的任务： 定义场景中的用户、业务逻辑和数据对象。定义对象的行为。定义对象的属性（attribute）或属性。定义对象之间的逻辑关系。统一建模语言统一建模语言(UML) 是阐述解决方案如何工作的工具。在图形化描述解决方案方面，它对于更完全分析解决方案非常有用。使用UML是一种容易的方法来画出组件、交互、关&nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2005/12/29/307405.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/307405.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41780/" target="_blank">[新闻]《电脑报》:《星际争霸2》掘金中国悬疑</a>]]></description></item><item><title>entlib2.0研究（五）--缓存组件的设计</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/13/296289.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 13 Dec 2005 07:08:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/13/296289.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/296289.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/13/296289.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/296289.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/296289.html</trackback:ping><description><![CDATA[摘要:  3缓存组件的设计缓存组件被设计实现下面的目标：l 提供一定的APIsl 是开发者在不了解内部工作原理的情况下，使用组件。l 使用配制工具进行简单的配制l 提供性能的优化l 线程安全，l 如果异常发生，确保后端数据的完整l 确保内存数据和后端数据的同步3.1设计亮点当你使用CacheFactory初始化CacheManager实例时，他在内部创建CacheManagerFactory对象，接着创建&nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2005/12/13/296289.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/296289.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41779/" target="_blank">[新闻]IBM开发成功22纳米SRAM 更快更节能</a>]]></description></item><item><title>entlib2.0的研究（四）--使用缓存组件开发应用程序</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/12/295458.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 12 Dec 2005 03:54:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/12/295458.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/295458.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/12/295458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/295458.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/295458.html</trackback:ping><description><![CDATA[摘要:  2使用缓存组件进行开发首先，解释如何配置，添加到你的解决方案中去，选择后端的存储器。接着，显示如何在特定场景中使用缓存组件。2.1添加配置信息注意: 这个版本的配制工具还没有发布，所以要改变配置，只能编辑XML文件，参考QuickStart和单元测试的配置文件。2.2添加程序代码完成由以下的几个步骤：l 添加Microsoft.Practices.EnterpriseLibrary.Cachin&nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2005/12/12/295458.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/295458.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41778/" target="_blank">[新闻]Windows 7 Server将被命名为Windows Server 2008 R2</a>]]></description></item><item><title>国际化组件的设计</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/09/293874.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 09 Dec 2005 07:52:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/09/293874.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/293874.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/09/293874.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/293874.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/293874.html</trackback:ping><description><![CDATA[&nbsp; 
<H3><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore">1.1.1<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-fareast-language: ZH-CN">国际化组件</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></H3>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<TABLE style="MARGIN-LEFT: 5.25pt; WIDTH: 450pt; BORDER-COLLAPSE: collapse; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellSpacing=0 cellPadding=0 width=600 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<TD style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BACKGROUND: #00ccff; PADDING-BOTTOM: 0cm; WIDTH: 283pt; PADDING-TOP: 0cm" vAlign=top width=377>
<P class=MsoBodyText><SPAN class=BodyTextBold><SPAN lang=EN-US style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-fareast-language: ZH-CN">Author<o:p></o:p></SPAN></SPAN></P></TD>
<TD style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BACKGROUND: #00ccff; PADDING-BOTTOM: 0cm; WIDTH: 167pt; PADDING-TOP: 0cm" vAlign=top width=223>
<P class=MsoBodyText><SPAN class=BodyTextBold><SPAN lang=EN-US style="mso-bidi-font-family: 'Times New Roman'">Contact<o:p></o:p></SPAN></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 1; mso-yfti-lastrow: yes">
<TD style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 283pt; PADDING-TOP: 0cm" vAlign=top width=377>
<P class=MsoBodyText><SPAN lang=FR style="mso-fareast-font-family: 宋体; mso-fareast-language: ZH-CN; mso-ansi-language: FR">Jin-Chen Zhu,LangChao</SPAN><SPAN lang=FR style="mso-ansi-language: FR"><o:p></o:p></SPAN></P></TD>
<TD style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 167pt; PADDING-TOP: 0cm" vAlign=top width=223>
<P class=MsoBodyText><SPAN lang=EN-GB style="mso-fareast-language: ZH-CN; mso-ansi-language: EN-GB">zhujch@langchao.com</SPAN><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore">1.1.1.1<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Goal<o:p></o:p></SPAN></H4>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-fareast-language: ZH-CN">国际化组件可以将非特定语言的字符串转化成特定语言的字符串，还可以通过反射的方式将某一界面上控件的文字换成特定语言的文字。</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore">1.1.1.2<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Context<o:p></o:p></SPAN></H4>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><o:p></o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore"><IMG height=357 hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/ipointer/global1.JPG" width=505><BR>1.1.1.3<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Behavior View<o:p></o:p></SPAN></H4>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore">1.1.1.4<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Structure View<BR><IMG height=344 hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/ipointer/global2.JPG" width=637><BR><o:p></o:p></SPAN></H4>
<P class=MsoNormal style="MARGIN-LEFT: 0cm; TEXT-INDENT: -54pt; mso-char-indent-count: -5.4; mso-para-margin-left: -5.4gd"><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 0cm; TEXT-INDENT: -36pt; mso-char-indent-count: -3.6; mso-para-margin-left: -3.6gd"><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 0cm; TEXT-INDENT: -36pt; mso-char-indent-count: -3.6; mso-para-margin-left: -3.6gd"><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 72pt; mso-char-indent-count: 7.2"><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore"><IMG height=432 hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/ipointer/global3.JPG" width=401><BR>1.1.1.5<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Other Specification<o:p></o:p></SPAN></H4>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore">1.1.1.6<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Best Practice <o:p></o:p></SPAN></H4>
<P class=MsoNormal style="TEXT-INDENT: 54pt; mso-char-indent-count: 6.0; mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; COLOR: teal; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes">ResourceFactory</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"> fa = <SPAN style="COLOR: teal">ResourceFactory</SPAN>.GetInstance();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: teal">GspRM</SPAN> resourceManager = <SPAN style="COLOR: blue">null</SPAN>;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">if</SPAN> (comboBox1.Text == <SPAN style="COLOR: maroon">"</SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; COLOR: maroon; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes">中文<SPAN lang=EN-US>"</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes">)<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>resourceManager = fa.GetRM(<SPAN style="COLOR: maroon">"formui"</SPAN>, <SPAN style="COLOR: maroon">"zh-cn"</SPAN>);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//resourceManager = fa.GetRM("aa","zh-cn");<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: teal">FormLanguageSwitchSingleton</SPAN> change = <SPAN style="COLOR: teal">FormLanguageSwitchSingleton</SPAN>.Instance;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>change.ChangeLanguage(<SPAN style="COLOR: blue">this</SPAN>, <SPAN style="COLOR: blue">new</SPAN> System.Globalization.<SPAN style="COLOR: teal">CultureInfo</SPAN>(<SPAN style="COLOR: maroon">"zh-chs"</SPAN>));<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">else<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>resourceManager = fa.GetRM(<SPAN style="COLOR: maroon">"formui"</SPAN>, <SPAN style="COLOR: maroon">"en-us"</SPAN>);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: teal">FormLanguageSwitchSingleton</SPAN> change = <SPAN style="COLOR: teal">FormLanguageSwitchSingleton</SPAN>.Instance;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>change.ChangeLanguage(<SPAN style="COLOR: blue">this</SPAN>, <SPAN style="COLOR: blue">new</SPAN> System.Globalization.<SPAN style="COLOR: teal">CultureInfo</SPAN>(<SPAN style="COLOR: maroon">"en-us"</SPAN>));<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: teal">MessageBox</SPAN>.Show(resourceManager.GetLocalizeToken(<SPAN style="COLOR: maroon">"result"</SPAN>, <SPAN style="COLOR: maroon">"jane"</SPAN>));</SPAN><SPAN lang=EN-US style="BACKGROUND: #d9d9d9; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto"><o:p></o:p></SPAN></P><img src ="http://www.cnblogs.com/ipointer/aggbug/293874.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41775/" target="_blank">[新闻]2008年8月19日IT博客精选</a>]]></description></item><item><title>entlib2.0研究（三）缓存组件的介绍</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/09/293839.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 09 Dec 2005 07:34:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/09/293839.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/293839.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/09/293839.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/293839.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/293839.html</trackback:ping><description><![CDATA[摘要:  缓存组件1介绍缓存组件可以使开发者将本地的缓存机制加到应用程序中。它支持内存中缓存和可选的后端的存储（数据库方式和隔离存储方式）。缓存组件提供retrieve, add, and remove cached data等功能。过期和自我清除策略也是给组件的一部分。缓存可以克服一些风险：l 性能。采用一种更为密切的方式，为数据的消费者存储相关的数据；以避免重复性的数据创建、处理和传输。l 可度量性。&nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2005/12/09/293839.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/293839.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41775/" target="_blank">[新闻]2008年8月19日IT博客精选</a>]]></description></item><item><title>Enterprise Library2.0研究（二）日志组件的开发说明</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/06/291825.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 06 Dec 2005 07:35:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/06/291825.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/291825.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/06/291825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/291825.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/291825.html</trackback:ping><description><![CDATA[摘要:  2使用日志组件进行开发2.1添加配置信息 待添加2.2增加准备的工作 首先，是使用日志组件的准备。（1） 添加对Microsoft.Practices.EnterpriseLibrary.Logging.dll, Microsoft.Practices.EnterpriseLibrary.Common.dll 的引用。（2） 在代码中添加：using Microsoft.Practices.En&nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2005/12/06/291825.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/291825.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41774/" target="_blank">[新闻]Facebook成为美国四大电视台争夺观众阵地</a>]]></description></item><item><title>Enterprise Library2.0研究（一）日志组件的使用场景</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/05/291116.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 05 Dec 2005 09:56:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/05/291116.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/291116.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/05/291116.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/291116.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/291116.html</trackback:ping><description><![CDATA[摘要: Enterprise Library2.0刚刚发布了December 2005的release，多了configuration的工具，真是及时，就不用自己做了。被安排看日志这一块，就开始翻译官方的doc，贴出来大家看看。翻得比较粗糙，大家包涵。1日志组件的介绍 日志组件简化了日志功能的实现。开发者可以将日志记录到多个不同的sinks:&#183; An e-mail message &#183; &nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2005/12/05/291116.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/291116.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41773/" target="_blank">[新闻]商业周刊：Twitter创收难 或被收购</a>]]></description></item><item><title>dudu，求救，我进不了我的blog了</title><link>http://www.cnblogs.com/ipointer/archive/2005/11/22/282174.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 22 Nov 2005 08:11:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/11/22/282174.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/282174.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/11/22/282174.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/282174.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/282174.html</trackback:ping><description><![CDATA[我输入我的blog的地址总是显示首页，是我的个别原因，还是博客园出问题了。<img src ="http://www.cnblogs.com/ipointer/aggbug/282174.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41772/" target="_blank">[新闻]奇虎360安全卫士负责人傅盛正式离职</a>]]></description></item><item><title>静态构造函数</title><link>http://www.cnblogs.com/ipointer/archive/2005/11/21/281596.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 21 Nov 2005 12:32:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/11/21/281596.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/281596.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/11/21/281596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/281596.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/281596.html</trackback:ping><description><![CDATA[<P>今天view代码的时候发现了一个类中有两个无参的构造函数，一个internal的，一个static的。我一时没反应过来，基础也打得不太好，于是写了个例子。发现两个都被调用了，而且static总是先被调用。下面是小例子。但其他静态的方法就不能出现同名同参数列表的情况。<BR>class Class1<BR>&nbsp;{<BR>&nbsp;&nbsp;/// &lt;summary&gt;<BR>&nbsp;&nbsp;/// 应用程序的主入口点。<BR>&nbsp;&nbsp;/// &lt;/summary&gt;<BR>&nbsp;&nbsp;[STAThread]<BR>&nbsp;&nbsp;static void Main(string[] args)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;TestConstructor test = new TestConstructor();<BR>//&nbsp;&nbsp;&nbsp;TestConstructor test;<BR>&nbsp;&nbsp;&nbsp;Console.ReadLine();<BR>&nbsp;&nbsp;}<BR><BR>public class TestConstructor<BR>&nbsp;{</P>
<P>&nbsp;&nbsp;static TestConstructor()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;Console.WriteLine("static");<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;internal TestConstructor()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;Console.WriteLine("internal");<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;internal void test()<BR>&nbsp;&nbsp;{}</P>
<P>//&nbsp;&nbsp;static void test()<BR>//&nbsp;&nbsp;{}<BR>&nbsp;}<BR>&nbsp;}<BR><BR>一下的来自google搜索：<BR></P>
<P>　　静态构造函数是实现对一个类进行初始化的方法成员。它一般用于对静态数据的初始化。静态构造函数不能有参数，不能有修饰符而且不能被调用，当类被加载时，类的静态构造函数自动被调用。如：</P>
<P>using System.Data;<BR>class Employee<BR>{<BR>　private static DataSet ds;<BR>　static Employee()<BR>　{<BR>　　ds = new DataSet(...);<BR>　}<BR>　...<BR>} </P>
<P>　　声明了一个有静态构造函数的类Employee。注意静态构造函数只能对静态数据成员进行初始化，而不能对非静态数据成员进行初始化。但是，非静态构造函数既可以对静态数据成员赋值，也可以对非静态数据成员进行初始化。</P>
<P>　　如果类仅包含静态成员，你可以创建一个private的构造函数：private TestClass() {&#8230;}，但是private意味着从类的外面不可能访问该构造函数。所以，它不能被调用，且没有对象可以被该类定义实例化。<BR><BR>对于上文的最后一点，我又试了一下。并发现,静态的构造函数在第一次对任意静态成员赋值时被调用。<BR>&nbsp;class Class1<BR>&nbsp;{<BR>&nbsp;&nbsp;/// &lt;summary&gt;<BR>&nbsp;&nbsp;/// 应用程序的主入口点。<BR>&nbsp;&nbsp;/// &lt;/summary&gt;<BR>&nbsp;&nbsp;[STAThread]<BR>&nbsp;&nbsp;static void Main(string[] args)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;Console.WriteLine("Will give A value");<BR>&nbsp;&nbsp;&nbsp;TestPrivateStatic.a = 3;<BR>&nbsp;&nbsp;&nbsp;Console.WriteLine("Done");<BR>&nbsp;&nbsp;&nbsp;TestPrivateStatic.a = 4;<BR>&nbsp;&nbsp;&nbsp;Console.ReadLine();<BR>&nbsp;&nbsp;}<BR><BR>public class TestPrivateStatic<BR>&nbsp;{<BR>&nbsp;&nbsp;public static int a;</P>
<P>&nbsp;&nbsp;static TestPrivateStatic()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;a = 2;<BR>&nbsp;&nbsp;&nbsp;Console.WriteLine("a has been given value");<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;}<BR><BR>就这样了，平时总会发现一些细小的东西，没记下来真是一种损失，现在来弥补。<BR></P><img src ="http://www.cnblogs.com/ipointer/aggbug/281596.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41771/" target="_blank">[新闻]土豆网首页全新改版 用户将获得更高权限</a>]]></description></item><item><title>.net开源项目nxbre中flow engine的研究报告</title><link>http://www.cnblogs.com/ipointer/archive/2005/11/16/277656.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Wed, 16 Nov 2005 05:35:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/11/16/277656.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/277656.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/11/16/277656.html#Feedback</comments><slash:comments>29</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/277656.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/277656.html</trackback:ping><description><![CDATA[<P>&nbsp; </P>
<P><SPAN>上周刚刚看完了<SPAN lang=EN-US>nxbre</SPAN>，写了一个<SPAN lang=EN-US>ppt</SPAN>给项目组评审，用来拟定我们<SPAN lang=EN-US>GSP</SPAN>中的规则引擎的实现需求。<SPAN lang=EN-US><BR><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>不知为什么我上传不了文件，只好把<SPAN lang=EN-US>ppt</SPAN>的内容贴出来给大家共享。大家如果这个开源项目感兴趣，可以留言索取。<SPAN lang=EN-US>ppt</SPAN>中不可能把细节讲的很清楚，而且由于时间关系，只写了其中的flow engine,请见谅。<SPAN lang=EN-US><BR><BR><B>Nxbre</B></SPAN><B>的简介</B><SPAN lang=EN-US><BR>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Nxbre</SPAN></B><B><SPAN>包括<SPAN lang=EN-US>interface engine</SPAN>和<SPAN lang=EN-US>flow engine </SPAN></B></P>
<P><B><SPAN>两种引擎的区别 </SPAN></B></P>
<P><SPAN lang=EN-US>the Flow Engine, which uses XML as a way to control process flow for an application in an external entity. It is basically a wrapper on C#, as it offers all its flow control commands (if/then/else, while, foreach), plus a context of business objects and results. </SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><SPAN lang=EN-US>the Inference Engine, which is a forward-chaining (data driven) deduction engine and that supports concepts like Facts, Queries and Implications (as defined in RuleML 0.86 Datalog) and like Rule Priority, Mutual Exclusion and Precondition(as found in many commercial engines). It is designed in a way that encourages the separation of roles between the expert who designs the business rules and the programmer who binds them to the business objects. </SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><B><SPAN>两种引擎使用的场景 </SPAN></B></P>
<P><SPAN lang=EN-US><SPAN>1.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>the Inference Engine supports priority, mutual exclusions and pre-conditions, </SPAN></P>
<P><SPAN lang=EN-US><SPAN>2.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>the Inference Engine uses a "standard" rule format (RuleML), </SPAN></P>
<P><SPAN lang=EN-US><SPAN>3.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>the Inference Engine has an elaborated memory model with support for isolated deduction space. </SPAN></P>
<P><SPAN lang=EN-US><SPAN>4.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Interface Engine </SPAN><SPAN>更适合于知识库或专家系统，因为在这样的系统中，<SPAN lang=EN-US>facts</SPAN>必须被保持 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>5.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Flow Engine </SPAN><SPAN>只是对一段逻辑进行了解析，并根据结果去做<SPAN lang=EN-US>action </SPAN></P>
<P><SPAN lang=EN-US><SPAN>6.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>The Flow Engine is really an instantaneous traversal of logical branches using transient data for evaluations of boolean expressions.</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><B><SPAN>选择的理由</SPAN></B></P>
<P><SPAN lang=EN-US><SPAN>1.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>在我们的<SPAN lang=EN-US>GSP</SPAN>系统中，没有对<SPAN lang=EN-US>fact</SPAN>保持的需求，没有通过规则优先级、互斥和前置条件的判断来选择规则 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>2.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Flow Engine </SPAN><SPAN>相对简单，易于维护 </SPAN></P>
<P><SPAN>所以，应该<SPAN lang=EN-US>Flow Engine</SPAN>是一个合适的选择 <BR></SPAN></P>
<P><B><SPAN lang=EN-US><BR>Flow Engine</SPAN></B><B><SPAN>的介绍</SPAN></B></P>
<P><SPAN>加载和卸载规则集的<SPAN lang=EN-US>API (BREImpl) </SPAN></P>
<P><SPAN lang=EN-US>Init </SPAN></P>
<P><SPAN lang=EN-US>Reset </SPAN></P>
<P><SPAN>数据操作的<SPAN lang=EN-US>API</SPAN>（<SPAN lang=EN-US>IBRERuleContext</SPAN>） </SPAN></P>
<P><SPAN lang=EN-US>SetObject </SPAN></P>
<P><SPAN lang=EN-US>GetObject </SPAN></P>
<P><SPAN>引擎执行的<SPAN lang=EN-US>API (BREImpl) </SPAN></P>
<P><SPAN lang=EN-US>Process </SPAN></P>
<P><SPAN lang=EN-US>Stop </SPAN></P>
<P><SPAN lang=EN-US><BR></SPAN><B><SPAN>规则引擎基本遵循以下<SPAN lang=EN-US>5</SPAN>个典型的步骤<SPAN lang=EN-US>&nbsp;</SPAN></B></P>
<P><SPAN lang=EN-US><SPAN>1.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>创建规则引擎对象 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>2.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>向引擎中加载规则集或更换规则集 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>3.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>向引擎提交需要被规则集处理的数据对象集合 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>4.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>命令引擎执行 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>5.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>导出引擎执行结果，从引擎中撤出处理过的数据 </SPAN></P>
<P><SPAN lang=EN-US><BR><B>Flow Engine</B></SPAN><B><SPAN>中的规则文件</SPAN></B></P>
<P><SPAN>规则语言一般分为两类： </SPAN></P>
<P><SPAN lang=EN-US>&#8220;</SPAN><SPAN>面向程序技术<SPAN lang=EN-US>&#8221;</SPAN>的规则语言，使用者是技术人员。在<SPAN lang=EN-US>Flow Engine</SPAN>中是<SPAN lang=EN-US>.bre</SPAN>文件（结构是<SPAN lang=EN-US>businessRule.xsd</SPAN>规定的） ，引擎真正解析的也是这个文件。 </SPAN></P>
<P><SPAN lang=EN-US>&#8220;</SPAN><SPAN>面向业务<SPAN lang=EN-US>&#8221;</SPAN>的规则语言，使用者是业务人员。规则定制器应该生成这份文档。在<SPAN lang=EN-US>Flow Engine</SPAN>中是<SPAN lang=EN-US>.xbre</SPAN>文件（结构是<SPAN lang=EN-US>businessRule.xsd</SPAN>规定的） 。 </SPAN></P>
<P><SPAN>两种<SPAN lang=EN-US>Schema</SPAN>的转换是由<SPAN lang=EN-US>transformXRules.xsl</SPAN>文件规定的。 </SPAN></P>
<P><SPAN lang=EN-US>Flow Engine</SPAN><SPAN>为加载规则文件提供了以下的类：<SPAN lang=EN-US>IRulesDriver,AbstractRuelsDriver,BusinessRulesFileDriver,XSLTRulesFileDriver,XBusinessRulesFileDriver, XBusinessRulesStreamDriver, XBusinessRulesStringDriver </SPAN></P>
<P><SPAN lang=EN-US><BR><B>Flow Engine</B></SPAN><B><SPAN>中的规则上下文</SPAN></B></P>
<P><SPAN>规则上下文中包含如下四块： </SPAN></P>
<P><SPAN lang=EN-US><SPAN>1.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>RuleFactory</SPAN><SPAN>集<SPAN lang=EN-US>(hashtable),</SPAN>包含<SPAN lang=EN-US>rule</SPAN>的解决方法，可以是默认的，也可以是自定义的 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>2.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Operator</SPAN><SPAN>集<SPAN lang=EN-US>(hashtable),</SPAN>包含可用的比较操作符，如：<SPAN lang=EN-US>==,&lt;,&gt;</SPAN>等 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>3.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Result</SPAN><SPAN>集<SPAN lang=EN-US>(hashtable),</SPAN>包含<SPAN lang=EN-US>result</SPAN>和用户初始的数据<SPAN lang=EN-US>,lookupobject</SPAN>就是在<SPAN lang=EN-US>result</SPAN>集中查找数据对象。每条<SPAN lang=EN-US>&lt;rule&gt;</SPAN>都会产生一条<SPAN lang=EN-US>result</SPAN>，每条<SPAN lang=EN-US>result</SPAN>又会包含<SPAN lang=EN-US>metadata</SPAN>和结果数据。<SPAN lang=EN-US>metadata</SPAN>中包含产生这条<SPAN lang=EN-US>result</SPAN>的<SPAN lang=EN-US>rule</SPAN>的<SPAN lang=EN-US>factory</SPAN>和<SPAN lang=EN-US>param </SPAN></P>
<P><SPAN lang=EN-US><SPAN>4.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>CallStack(stack),</SPAN><SPAN>目前没发现有什么用，只是在往<SPAN lang=EN-US>Result</SPAN>集中添加<SPAN lang=EN-US>result</SPAN>的同时也往此中添加 </SPAN></P>
<P><SPAN>支持上下文的主要类型：<SPAN lang=EN-US>IBRERuleContext,AbstractBRERuleContext,BRERuleContextImpl </SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>创建规则引擎对象<SPAN lang=EN-US>&nbsp;</SPAN></B></P>
<P><SPAN>构建<SPAN lang=EN-US>BREFactoryConsole</SPAN>对象，他负责构建<SPAN lang=EN-US>BREImpl</SPAN>对象，并向外发布引擎中出现的<SPAN lang=EN-US>log</SPAN>和<SPAN lang=EN-US>exception </SPAN></P>
<P><SPAN>构建<SPAN lang=EN-US>BREImp</SPAN>对象之前，必须首先构建<SPAN lang=EN-US>BREFactory,</SPAN>他负责将<SPAN lang=EN-US>log</SPAN>和<SPAN lang=EN-US>exception</SPAN>的代理挂到<SPAN lang=EN-US>BREImp</SPAN>对象中的相应<SPAN lang=EN-US>event</SPAN>上去 </SPAN></P>
<P><SPAN>用<SPAN lang=EN-US>IRuleDriver</SPAN>初始化<SPAN lang=EN-US>BREImp</SPAN>对象 </SPAN></P>
<P><SPAN>相关的类型：<SPAN lang=EN-US> BREFactoryConsole</SPAN>，<SPAN lang=EN-US>BREFactory</SPAN>，<SPAN lang=EN-US>BREImp </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>加载规则集</SPAN></B></P>
<P><SPAN>在<SPAN lang=EN-US>Flow Engine</SPAN>中<SPAN lang=EN-US>rule</SPAN>（在<SPAN lang=EN-US>.bre</SPAN>文件中用<SPAN lang=EN-US>&lt;rule&gt;</SPAN>标签标识的部分）是一些用<SPAN lang=EN-US>id</SPAN>唯一标识的对象。加载这些<SPAN lang=EN-US>rule</SPAN>的方式有两种： </SPAN></P>
<P><SPAN lang=EN-US><SPAN>1.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>在引擎初始的时候，先从规则文件中查找<SPAN lang=EN-US>&lt;factory&gt;</SPAN>标签，找到需要加载的<SPAN lang=EN-US>RuleFactory</SPAN>。通过反射的方式，创建该类型的实例（引擎默认的<SPAN lang=EN-US>rule</SPAN>） </SPAN></P>
<P><SPAN lang=EN-US><SPAN>2.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>在引擎的运行时，外部需要对规则文件中定义的<SPAN lang=EN-US>rule</SPAN>有特殊的处理，必须在外部环境中构造<SPAN lang=EN-US>BRERuleFactory</SPAN>对象，并以一个代理作为它的参数，在代理的方法中实现对<SPAN lang=EN-US>rule</SPAN>的处理 </SPAN></P>
<P><SPAN>讨论：是否还需要第三种方式，因为使用第二种方式扩展系统时，外部环境开发者不得不很了解目前使用的规则文件中到底使用了哪些扩展的<SPAN lang=EN-US>rule</SPAN>，并为这些<SPAN lang=EN-US>rule</SPAN>些处理方法。当我们修改了规则文件，并添加了一些扩展<SPAN lang=EN-US>rule</SPAN>时，外部环境的开发者不得不修改他们的程序，以适应新的规则文件。 </SPAN></P>
<P><SPAN>我们现在想要的是像使用默认的<SPAN lang=EN-US>rule</SPAN>一样方式来使用扩展<SPAN lang=EN-US>rule</SPAN>，这就需要我们用一种注册的方式，在引擎加载<SPAN lang=EN-US>rule</SPAN>之前，将扩展的<SPAN lang=EN-US>rule</SPAN>注册进系统。 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><SPAN>所有的<SPAN lang=EN-US>rule</SPAN>都必须通过引擎上下文（<SPAN lang=EN-US>IBRERuleContext</SPAN>）的<SPAN lang=EN-US>SetFactory</SPAN>方法注册进引擎上下文中 </SPAN></P>
<P><SPAN lang=EN-US>IBRERuleFactory</SPAN><SPAN>中有<SPAN lang=EN-US>ExecuteRule</SPAN>方法，这就是处理默认<SPAN lang=EN-US>rule</SPAN>的方法 </SPAN></P>
<P><SPAN>支持规则集的相关类型：<SPAN lang=EN-US>IBRERuleFactory,BRERuleFactory(</SPAN>主要是为自定义的<SPAN lang=EN-US>rule</SPAN>设计的，他的<SPAN lang=EN-US>ExecuteRule</SPAN>中只是调用了代理<SPAN lang=EN-US>) </SPAN></P>
<P><SPAN>在写代理方法的时候注意，引擎调用代理的时候，可以提供上下文和相关的参数，这是我们极其需要的 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>加载操作符<SPAN lang=EN-US><BR>&nbsp; </SPAN></B></P>
<P><SPAN>很简单，在<SPAN lang=EN-US>BREImpl</SPAN>的<SPAN lang=EN-US>init()</SPAN>方法中，用反射的方式从当前<SPAN lang=EN-US>Assembly</SPAN>中查找所有实现<SPAN lang=EN-US>IBREOperator</SPAN>接口的类型，创建实例，加入上下文中。 </SPAN></P>
<P><SPAN>这里的操作符只是<SPAN lang=EN-US>if</SPAN>语句中判断大小用的，而<SPAN lang=EN-US>+</SPAN>，<SPAN lang=EN-US>-</SPAN>，<SPAN lang=EN-US>*</SPAN>，<SPAN lang=EN-US>/</SPAN>，或其他数学函数，我认为可以作为默认的<SPAN lang=EN-US>rule</SPAN>来对待 </SPAN></P>
<P><SPAN>支持的相关类型：<SPAN lang=EN-US>IBRERuleOperator,</SPAN>实现他的类其实就是实现一个<SPAN lang=EN-US>compare</SPAN>的<SPAN lang=EN-US>strategy </SPAN></P>
<P><SPAN>讨论：这一块是不是能满足需求 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>中提交数据对象<SPAN lang=EN-US><BR>&nbsp; </SPAN></B></P>
<P><SPAN>如前所述，数据对象在系统中是被当成<SPAN lang=EN-US>result</SPAN>来处理的，封装他的<SPAN lang=EN-US>BRERuleObject</SPAN>类继承于<SPAN lang=EN-US>AbstractBRERuleResult</SPAN>，会被插入上下文的<SPAN lang=EN-US>result</SPAN>集中。数据对象被封装到<SPAN lang=EN-US>BRERuleObject</SPAN>的<SPAN lang=EN-US>Result</SPAN>属性中。 </SPAN></P>
<P><SPAN>具体的，在外部环境中，通过上下文的<SPAN lang=EN-US>SetObject(id,object)</SPAN>，就可以将数据对象添加到上下文中了。 </SPAN></P>
<P><SPAN>同样，获取数据对象的时候用上下文的<SPAN lang=EN-US>GetObject(id)</SPAN>。 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>中命令引擎执行<SPAN lang=EN-US><BR>&nbsp; </SPAN></B></P>
<P><SPAN>在启动引擎之前，要注意必须执行<SPAN lang=EN-US>BREImpl</SPAN>的<SPAN lang=EN-US>Reset()</SPAN>方法，清空留在上下文中的上一次的<SPAN lang=EN-US>Result</SPAN>集和<SPAN lang=EN-US>CallStack</SPAN>清空，否则，可能会干扰本次的执行。这有一次表明了<SPAN lang=EN-US>Flow Engine</SPAN>是一个对逻辑分支的瞬时遍历，他不能保存结果，也不能用于以往知识对执行实例有影响的系统中。 </SPAN></P>
<P><SPAN>要执行引擎，只需调用<SPAN lang=EN-US>BREImpl</SPAN>的<SPAN lang=EN-US>process()</SPAN>方法，引擎就会根据规则文件中指定的逻辑来执行了。 </SPAN></P>
<P><SPAN>更具体的，<SPAN lang=EN-US>processxml()</SPAN>方法判断<SPAN lang=EN-US>XPathNavigator</SPAN>当前节点的类型，跳转到特定的处理程序中。 </SPAN></P>
<P><SPAN>如果当前节点有子节点，那么调用<SPAN lang=EN-US>DoRecursion()</SPAN>来进行迭代。 </SPAN></P>
<P><SPAN>执行的方式是先深的遍历。 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>中导出结果<SPAN lang=EN-US><BR>&nbsp; </SPAN></B></P>
<P><SPAN>很简单，通过上下文的<SPAN lang=EN-US>GetResult(id)</SPAN>，就能导出运行的结果。<SPAN lang=EN-US>Id</SPAN>与该条<SPAN lang=EN-US>rule</SPAN>的<SPAN lang=EN-US>id</SPAN>相同。 </SPAN></P>
<P><SPAN>真正结果封装在<SPAN lang=EN-US>AbstractBRERuleResult</SPAN>的<SPAN lang=EN-US>result</SPAN>属性中 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>中的<SPAN lang=EN-US>log</SPAN>和<SPAN lang=EN-US>Exception</SPAN>处理<SPAN lang=EN-US><BR>&nbsp; </SPAN></B></P>
<P><SPAN>提供了丰富的向外部暴露内部运行情况的接口 </SPAN></P>
<P><SPAN>还指定了<SPAN lang=EN-US>log</SPAN>和<SPAN lang=EN-US>exception</SPAN>的级别，用于向不同的终端暴露信息 </SPAN></P>
<P><SPAN>内部使用<SPAN lang=EN-US>DispatchLog(message,level),DispatchException(message,level) </SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><img src ="http://www.cnblogs.com/ipointer/aggbug/277656.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41770/" target="_blank">[新闻]WordPress 2008 年发展迅猛</a>]]></description></item><item><title>XPath最通俗的教程（ZZ）</title><link>http://www.cnblogs.com/ipointer/archive/2005/10/20/258305.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 20 Oct 2005 00:43:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/10/20/258305.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/258305.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/10/20/258305.html#Feedback</comments><slash:comments>60</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/258305.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/258305.html</trackback:ping><description><![CDATA[摘要:  以下是本人找到的最完整最易懂的XPath教程，不敢私藏，拿出来与大家分享。帮我点旁边的google广告呀。 实例 1基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径/AAA选择根元素AAA&lt;AAA&gt; &lt;BBB/&gt; &lt;CCC/&gt; &lt;BBB/&gt; &lt;BBB/&gt; &lt;DDD&nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2005/10/20/258305.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/258305.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41769/" target="_blank">[新闻]百度娱乐访上线 打造网友明星实时互动平台</a>]]></description></item><item><title>【注意】一个巨牛的招聘题(ZZ)</title><link>http://www.cnblogs.com/ipointer/archive/2005/10/14/254800.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 14 Oct 2005 06:33:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/10/14/254800.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/254800.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/10/14/254800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/254800.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/254800.html</trackback:ping><description><![CDATA[我的老同学开创了一个软件公司，富的流油。今天他到这个城市来后马上打电话给我：&#8220;还好吧？我到这里的大学招毕业生，要呆上五天，咱哥们趁这个机会好好聚一聚，我做东。&#8221;<BR><BR>　　既然他要做东，我理所当然顺水推舟。来到他下榻的宾馆，看见一个大学生模样的人站在他面前接受面试。我的老同学说：&#8220;我这里有个魔方，你能不能把它弄成六面六个颜色？&#8221;那个大学生拿着魔方，面有难色。<BR><BR>　　我的老同学看了看我，对大学生说：&#8220;如果你没有考虑好，可以把魔方拿回去考虑我直到星期五才走。&#8221;等那个大学生走了以后，我问老同学：&#8220;这是你独创的考题？&#8221;<BR><BR>　　&#8220;咳！这个人有后台，我不好意思不要他，所以出个题考他，以便到时候安排个合适的职务。&#8221;<BR><BR>　　&#8220;要是我，&#8221;我说：&#8220;会把魔方拆开，然后一个个安上去。&#8221;&#8220;如果他这样做就好了，这就说明他敢作敢为，就可以从事开拓市场方面的工作。&#8221;<BR><BR>　　&#8220;那其他做法呢？&#8221;&#8220;如果他拿漆把六面刷出来，说明他很有创意，可以从事软件开发部的工作；如果他今天下午就把魔方拿回来，说明他非常聪明，领悟能力强，做我的助理最合适了；如果他星期三之前把魔方拿回来，说明他请教了人，也就是说他很有人缘，可以去客户服务部工作；如果在我走之前拿回来，说明他勤劳肯干，从事低级程序员的工作没问题；如果他最终拿回来说他还是不会，那说明他人很老实，可以从事保管或财物方面的工作；如果他拿不回来，那我就爱莫能助了。&#8221;<BR><BR>　　第二天晚上，我的老同学又请我吃饭。在饭桌上，我又问起魔方的事。这一回，老同学有些得意洋洋：&#8220;那个大学生我要定了，他今天早上把魔方还给了我，你猜怎么着？他新买了一个魔方！他还说&#8216;你的魔方我扳来扳去都无法还原，所以，我新买了一个，比你那个更大、更灵活！&#8217;&#8221;<BR><BR>　　&#8220;这说明什么？&#8221;我问。我的老同学压低了声音：&#8220;他绝对是做盗版的好材料！&#8221;<BR><img src ="http://www.cnblogs.com/ipointer/aggbug/254800.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41767/" target="_blank">[新闻]美18岁女生创办网站成亿万富豪</a>]]></description></item><item><title>如何安装ms 的 Enterprise Library</title><link>http://www.cnblogs.com/ipointer/archive/2005/10/11/252427.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 11 Oct 2005 07:34:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/10/11/252427.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/252427.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/10/11/252427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/252427.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/252427.html</trackback:ping><description><![CDATA[<P>这个