博文

WF持久化机制剖析(2007-11-23 09:26:00)

摘要:1 为什么要持久化状态?   1.1 内存是有限的,将等待或者休眠的流程暂时从内存中卸载有利于提供性能 1.2 运行时可能会出现不稳定因素导致流程崩溃,持久化可以提供流程恢复的可能 1.3 流程中的事务或者补偿机制需要隔离的流程状态来辅助完成 2 什么时候会发生流程被持久化? 2.1 在流程中加入的活动被标有PersistOnClose属性,这是人为设定的强制持久化策略, 即流程执行到该步骤必须要保存一下,不表示从内从中卸载。 2.2 活动的运行时状态被设置为Executing时(即运行中)(如果DelayActivity),下一个活动必须在将来的某个时候到达, 这时引擎会决定使流程进行持久化。 2.3 当在流程实例之外手动调用卸载流程的方法时会导致持久化 2.4 当具有补偿特性的活动(如CompensatableSequenceActivity)被创建多于一个执行上下文时会发生持久化(请原谅这话说的有点专业,因为解释它需要费长篇大论) 3 什么时候会发生流程被反持久化? 流程被保存后是不具有自我激活的功能的,必须通过外部方法去激活它。 3.1 当调用引擎的获取一个工作流实例的方法时, 如果实例不在内存中,引擎会自动向已注册的持久化服务发出装载其状态的指令 4 什么是流程阻塞态? 4.1 在流程执行过程中,当遇到例如Delay这样的活动时,流程被指示进入休眠状态(钝化),即被挂起, 此时流程根活动被标记为阻塞态,引擎发出持久化指令。 4.2 什么时候出现非阻塞态持久化化行为? 4.2.1 手动调用持久化或者设置持久化点(PersistOnCloseAttribute)的时候 5 什么是流程锁定态? 5.1 当流程执行从事务范围(TransacationScope)退出或结束了一个具有持久点标记的活动时, 引擎自动持久化该流程状态,此时流程被标记为锁定态,即独占的。 5.2 为什么需要这个状态? 5.2.1 因为流程实例有可能被多个HOST加载,如果没有这个状态表示, 当出现上述情况时,使开发者可以根据自己的设计要求去做排他操作,这样流程状态会发生紊乱,或破坏局部流程的原子操作。 6 如何唤醒流程? 6.1 流程被持久化以后就变成了数据,而不具有任何行为,所以它不具有自我唤醒的功能 6.2 流程可以通过定时器轮......

阅读全文(5924) | 评论:1

从这里开始认识 MS Workflow Foundation(即 WF)(2007-11-23 09:26:00)

摘要:从这里开始认识 MS Workflow Foundation(即 WF)       最近正在学习WF,收集了一些资料,再此也提供出来供有兴趣的朋友参考。

1.系统必备
  —我们需要安装WinFX(下载)和Visual Studio 2005 extensions for .NET Framework 3.0 (Windows Workflow Foundation)。这是我们必备的开发组件。 —WF作为net3.0的一部分发布,要运行需要安装net3.0 — WF提供了一个在VS2005中可视化设计工作流的设计器,Visual Studio 2005 Extensions for Windows Workflow Foundation,只有安装后才能在VS2005中建立WF项目。

2.WF是什么?
  —WF本身并不是一个业务平台,它只是为开发人员提供创建工作流软件的一个平台,也就是说WF不是工作流应用平台,而是一个开发工作流应用的平台。  —MS将WF作为Vista的一个基本API发布,而不是一个独立的软件(如BizTalk,Office)。

3.WF适合做什么?  —使用WF可以开发具有以下特点的工作流平台:     1.业务流程辅助办公软件
    2.软件内部工作的顺序控制
    3.自动筛选查询类系统
    4.自动化控制中 4.WF的工作模式
  —WF提供了两类工作流模式,流模式(Sequential)与状态机模式(State Machine ):  —顺序工作流 非常适合以下类型的操作,即该操作由依次执行直至最后一个活动完成的步骤的管线表示。但是,顺序工作流的执行并非完全是顺序的。它们仍然可以接收外部事件或者启动并行任务,在这种情况下,确切的执行顺序可能有所不同。 —状态机工作流 由一组状态、转换和操作组成。首先,将一个状态表示为起始状态,然后,基于事件执行向另一个状态的转......

阅读全文(11210) | 评论:0

用javascript实现html页面之间的参数传递的四种方法 (2007-06-26 15:10:00)

摘要:我们知道,在服务器端asp,jsp等程序可以接受html页面上的form传来的参数。那么,可不可以传递参数给html页面呢。可以。
原理:通过window.location.href中的分割符获得各个参数
方法一:

/*
 *函数功能:从href获得参数
 *sHref:   http://www.cscenter.com.cn/arg.htm?arg1=d&arg2=re
 *sArgName:arg1, arg2
 *return:  the value of arg. d, re
 */
function GetArgsFromHref(sHref, sArgName)
{
    var args  = sHref.split("?");
    var retval = "";
    
    if(args[0] == sHref) /*参数为空*/
    {
         return retval; /*无需做任何处理*/
    }  
    var str = args[1];
    args = str.split("&");
    for(var i =&nb......

阅读全文(6017) | 评论:1

C#中对Excel的操作 (2007-06-18 19:13:00)

摘要:Excel表格文档由于其简单易用,普遍应用于不少单位或部门,因而在编写应用程序过程中,有时会需要对Excel文档进行操作,最简单的情况通常有两种:(1)需要获取文档中一些单元格的值;(2)将文档导入至数据库。   1).在操作Excel文档之前,需要添加对Excel对象库的引用: 引用—COM—Microsoft Excel 11.0 Object Library(版本号可能不同)   2).以下代码示意打开一个已有的Excel文档的第一个sheet页,获取单元格“B1”的内容,并判断其值是否为“my”:
        private void Operate(string pFileName)
        {
            Excel.Application app = new Excel.Application();//打开一个Excel应用
            if (app == null)
            {
                return;
            }

      &......

阅读全文(8676) | 评论:0

.Net 机制下委托(一) 事件委托(2007-06-15 10:22:00)

摘要:一、 认识委托
    一个简单的例子:
 
    张三看到餐桌上有一个桔子,由于自己怕动(主要是出于自己要玩游戏,走不开),立刻就对着他妈妈喊:“我要吃桔子,妈妈帮我拿过来。”,接着,他妈妈听到乖儿子要吃桔子,就立刻送去给儿子了。
    从某种意义上来说,把儿子发出消息要桔子的动作与妈妈送桔子给儿子的动作相关联的过程就称为委托,也就是说儿子发出消息要桔子这个事件委派妈妈根据他的消息内容去完成他想要做的事。
 
二、 理解.net机制下的委托概念
   
    关于委托的声明:
   
    delegate 返回类型 方法声明( 参数1,参数2,参数3… );
   
    例如:delegate void ButtonTextChangeEvent( object sender, EventArgs e );
 
    注意:声明一个ButtonTextChangeEvent,就是创建了一个“委托类”,在编译期间,就会产生个委托类在代码区,因而它可以在类里面声明,也可以跟类在同一域(即命名空间中定义),享受与类同等待遇,那么在这个类里面会有一个最关键的函数就是
 
    virtual 返回类型 方法声明(参数1,参数2,参数3…); 图示:
      那么这个Ivoke虚函数是用做干什么的呢?它主要是用来调用某个绑定了的函数,说白了,delegate充其量就是一个中间件(相当于我们所见的媒婆)。
 
namespace ConsoleApplicationTest
{
//声明一个委托(如果您学过C++那么它很像C++里面的typedef.)
    public......

阅读全文(5213) | 评论:1

用C#编写发手机中文短信息Windows服务(2007-06-11 11:48:00)

摘要:最近在电脑城上买了一根NOKIA3210的数据线,玩了几天改LOGO、改铃声后也将数据线扔在一边。直到前几天在Http://oxygensoftware.com上看到有发手机短信息的二次开发控件,才想起多日不用的数据线,而且最近在学C#,觉得用C#做个发短信息的程序也不错,经过多天的测试,终于实现用电脑+数据线+手机的模式,实现在单位的局域网平台上发送短信息了。   由于在单位使用到发手机短信息的地方有很多,可能是从网页、可能是OUTLOOK中的窗体、也可能是某台非Windows操作系统的主机的某个系统,所以经过思考探讨,觉得最好的解决方案是采用Windows的“服务”,定时从一个目录中固定格式的文本文件中读取出相应的信息,发送出去。而其它客户端只需往该目录写入文本信息即可。思路定下来后就让我们开始吧!   先交待一下开发平台:Windows 2000 Advance Server操作系统、Visual Studio .Net 、Oxygen Sms ActiveX Control V2.3 (Share Ware)、 Nokia 3210手机通过数据线接在COM1上。运行Visual Studio .Net,新建一个C#的项目,选择“Windows Server”类型的项目,命名为“SmsServer”。在Server1的设计画面,将“ServerName”命名为“SmsServer”。点击“视图设计器按钮”切换到设计画面,在“Windows Forms”工具箱中拖一时钟控件,命名为“SmsTimer”,在“Components”工具箱中拖一“EventLog”控件。命名为“eventLog1”。在“项目”菜单中点击“添加引用”,选择“COM”页,浏览到安装Oxygen Sms ActiveX Control V2.3程序的目录,找到SMSControl.ocx添加到“选定的组件”中。   将Server1.cs代码替换为 using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;

阅读全文(4768) | 评论:1

C#编写IP_MAC防欺骗程序(2007-06-11 11:43:00)

摘要:单位的学生成绩管理系统是ASP.NET做的,很担心非法人员修改。为了方便管理,单位的每台机子IP是固定的。由于只是允许办公计算机访问成绩修改的页面,计算机数量并不多,所以我把所有办公计算机的IP-MAC专门做一张数据库表,且一一对应。操作之前判断来访的IP-MAC地址,且IP-MAC成对限制。两个地址必须同时正确才可以访问,若不一致则拒绝访问,并且记录该信息,方便我们找出非法操作者。这是我们最初方案,但是程序做好以后,却发现了新的问题。当有人要做非法操作,会出现以下情况:只修改IP、只修改MAC、同时修改IP-MAC。对于前两种情况,我们的服务器端已全可以判断、限制了。但是对于情况三,非法操作者成对修改IP-MAC,而且该IP-MAC对是其他被授权的主机的正确IP-MAC对,在服务器端我们已经无力限制。于是便有了方案二:做一个判断MAC地址是否被修改的Windows服务,这个服务安装在每个客户机上,如果MAC地址被修改,关闭客户端的IE,从而限制访问,
方案一
服务器端实现,实现的关键代码如下:
using System.Runtime.InteropServices ;//请注意引用动态链接库,则需要此命名空间,它提供各种各样支持 COM interop 及平台调用服务的成员。其中最重要的属性有 DllImportAttribute(可以用来定义用于访问非托管 API 的平台调用方法)
[DllImport("iphlpapi.dll", ExactSpelling=true)] //在.net中使用动态链接库
public static int SendARP( int DestIP, int SrcIP, [Out] byte[] pMacAddr, ref int PhyAddrLen );
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip);
private void Button1_Click(object sender, System.EventArgs e)
{
string client_ip=Request.UserHostAddress ;//获得客户端IP
Label_ip.......

阅读全文(7511) | 评论:0

c#中异步基于消息通信的完成端口的TCP/IP协议的组件实现(源代码) 服务器端(2007-06-11 11:42:00)

摘要:using System;
using System.IO;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Threading; namespace MyKJ
...{
    /**//// <summary>
    /// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的服务端
    /// </summary>
    public class MyTcpIpServer : System.ComponentModel.Component
    ...{
        private int bufferSize=2048;
        private string tcpIpServerIP="";
        private int tcpIpServerPort=11000;
        private Socket listener=null;
        private ManualResetEvent allDone = new ManualResetEvent(false);
        private ManualResetEvent sendDone = new Ma......

阅读全文(7940) | 评论:1

c#中异步基于消息通信的完成端口的TCP/IP协议的组件实现(源代码) 客户端 (2007-06-11 11:41:00)

摘要:using System;
using System.IO;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Threading; namespace MyKJ
...{
    /**//// <summary>
    /// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的客户端
    /// </summary>
    public class MyTcpIpClient : System.ComponentModel.Component
    ...{
        private int bufferSize=2048;
        private string tcpIpServerIP="127.0.0.1";
        private int tcpIpServerPort=11000;
        private Socket ClientSocket=null;
        private ManualResetEvent connectDone = new ManualResetEvent(false);
        private ManualResetEvent ......

阅读全文(6122) | 评论:2

我的 C#+flash socket 聊天程序(C#源代码)(2007-06-11 11:39:00)

摘要:此篇文章为roading所有,欢迎转载,但请注明原处. 看见还有很多人在研究flash的socket,其中经常会出现一些问题,所以将我以前写的一个程序代码拿出来给大家参考... 这是c#的代码,经过测试的,本来想把源程序都放上来,可以我用的是vs2005(而且现在又坏了,系统出问题了),下面是程序的主要源代码,不包含一些自动生成的代码.这些代码是根据一个开源的C#socket程序改编的,而且我已经写了比较详细的注释了,如果你看了这些代码还是发现有问题,可以向我索取完整的源程序: 把源文件传上来,大家可以下载(gmail又打不开了,不能给留email的同学发了,自己下载吧):  点击下载此文件
//-------------------------------- //---------------------------------------------------------------------------------------------------------------
//form1.cs
using System;
using System.IO;
using System.Drawing;
using System.Collections;//ArrayList引用到这个命名空间的类
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Threading; namespace ChatServer//服务器端命名空间
{
 /// <summary>
 /// Form1 的摘要说明。
 /// </summary>
 public class Form1 : System.Windows.Forms.Form
 {
  private int listenport = 9050;//监听端口
  pri......

阅读全文(6615) | 评论:1