http://www.yesky.com/SoftChannel/72342380468109312/20020611/1615308.shtml
希望用的上

解决方案 »

  1.   


    #region 注释
    /**************************************************************************************
     * 文件名:          BizService.cs
     * 创建人:          leon
     * 创建日期:        2003年11月5日
     * 修改人:
     * 最后修改日期:    2003年11月6日
     * 描述:            CBizService类:          业务访问代理类,在业务请求和业务处理组件
     *       之间提供代理,提供了同步和异步两种访问
     *                                            业务处理组件的方式
     * 
     *  CBizBroadcast类:        回调消息广播类,CBizService异步访问业务处
     *   理组件后,它负责将响应的回调消息返回
     *   给请求者
     * 
     *  InvokeDelegate委托:     异步访问委托,为CBizService类异步调用业务
     *   处理组件时使用
     * 
     *  DBizEventHandler委托:   消息广播委托,为业务请求者和广播类使用,
     *   以实现消息的响应与接收
     * 
     * 
     * 版本:            1.0.0.0
    **------------------------------------------------------------------------------
    ** Copyright (c) 2003-? ****************************************************************************************/
    #endregion
    using System;
    using System.Xml;
    using FERP.Biz;namespace FERP.Biz
    {
    /*****************************************************************
    * 为异步调用业务分发组件而使用的委托
    * 在.Net提供的用于异步调用的三种方式中,我们选择使用回调函数传递
    * 异步消息的方式
    *****************************************************************/
    public delegate XmlNode InvokeDelegate(XmlNode inXml);
    /**********************************************
    * 表示业务广播的委托
    **********************************************/
    public delegate void DBizEventHandler(string msgID,XmlNode xmlData); /// <summary>
    /// 业务访问代理类,在业务请求和业务处理组件之间提供代理
    /// </summary>
    public class CBizService
    {
    /*=================================================================
     类的成员
     =================================================================*/
    #region
    private string           _DataStoreID;               //存放业务帐套编号的私有变量
    private Int32            _BizID;                     //存放业务场景编号的私有变量
    private string           _AccountID;                 //存放用户帐号的私有变量
    private string           _Token;                     //存放用户令牌的私有变量
    private string           _ErrMsg;                    //记录组件内错误消息内容的变量
    private InvokeDelegate   _invokedelegate;            //处理异步回调的委托变量
    public XmlNode           _node;                      //异步返回的处理文档  for test only
    public Int32             BizID{get{return _BizID;}}  //允许访问的业务场景编号
    public string            ErrMsg{get{return _ErrMsg;}}//提取错误信息的属性
    #endregion /*=================================================================
     构造函数,提供三个重载的构造
     =================================================================*/
    #region 
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="dataStoreID">帐套编号</param>
    /// <param name="bizID">业务场景编号</param>
    /// <param name="accountID">用户帐号</param>
    /// <param name="token">用户令牌</param>
    public CBizService(string dataStoreID,Int32 bizID,string accountID,string token)
    {
    try
    {
    _DataStoreID=dataStoreID;
    _BizID=bizID;
    _AccountID=accountID;
    _Token=token;
    }
    catch(System.Exception er)
    {
    _ErrMsg=er.Message.ToString();
    System.Diagnostics.Debug.WriteLine(er.Message.ToString());
    throw er;
    }
    }
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="bizID">业务场景编号</param>
    /// <param name="accountID">用户帐号</param>
    /// <param name="token">用户令牌</param>
    public CBizService(Int32 bizID,string accountID,string token)
    {
    try
    {
    _BizID=bizID;
    _AccountID=accountID;
    _Token=token;
    }
    catch(System.Exception er)
    {
    _ErrMsg=er.Message.ToString();
    System.Diagnostics.Debug.WriteLine(er.Message.ToString());
    throw er;
    }
    }
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="bizID">业务场景编号</param>
    public CBizService(Int32 bizID)
    {
    try
    {
    _BizID=bizID;
    }
    catch(System.Exception er)
    {
    _ErrMsg=er.Message.ToString();
    System.Diagnostics.Debug.WriteLine(er.Message.ToString());
    throw er;
    }
    }
    #endregion
    /*================================================================
     = 为异步调用业务分发组件而使用的委托
     = 在.Net提供的用于异步调用的三种方式中,我们选择使用回调函数传递
     = 异步消息的方式
     ==================================================================*/
    // public delegate XmlNode InvokeDelegate(XmlNode inXml);
    /*================================================================
     * 类的方法
     ==================================================================*/
    #region 私有 /// <summary>
    /// 发送返回的异步调用结果
    /// </summary>
    /// <param name="result"></param>
    private void Callback(IAsyncResult result)
    {
    try
    {
    //异步是否已经执行完毕
    if (result.IsCompleted)
    {
    //停掉异步请求
    XmlNode nd=_invokedelegate.EndInvoke(result);
    //使用广播消息的类广播消息
    CBizBroadcast.Send(_BizID.ToString().Trim(),nd);
    }
    }
    catch(System.Exception er)
    {_ErrMsg=er.Message.ToString();
    /*!!!!!!!!!!!!!!!!!!!!!!!!!!
     * 下面的代码建议暂时保留,若确定构建错误文档的工作由
     * 业务分发组件完成后,再进行删除
     *!!!!!!!!!!!!!!!!!!!!!!!!!!*/
    // try
    // {
    // _ErrMsg=er.Message.ToString();
    // System.Diagnostics.Debug.WriteLine(er.Message.ToString());
    // //发送出错信息报告
    // XmlDocument doc=new XmlDocument();
    //// string Err=er.Message.ToString();
    // XmlNode NodeErr=doc.CreateElement("Error");
    // XmlAttribute arErrMsg=doc.CreateAttribute("ErrorMessage");
    // XmlAttribute arErrSource=doc.CreateAttribute("ErrorSource");
    // arErrMsg.Value=er.Message.ToString();
    // arErrSource.Value="在执行业务逻辑时发生";
    // NodeErr.Attributes.Append(arErrMsg);
    // NodeErr.Attributes.Append(arErrSource);
    //
    //
    // CBizBroadcast.Send(_BizID.ToString().Trim(),NodeErr);
    // }
    // catch(System.Exception err)
    // {
    // System.Diagnostics.Debug.WriteLine(err.Message.ToString());
    // }
    }
    }
    /// <summary>
    /// 析构函数,清理所有正在使用的资源。
    /// </summary>
    ~CBizService()
    {
    _invokedelegate=null;
    }
    #endregion //私有
    #region 公有
    /// <summary>
    /// 同步调用业务分发组件的方法
    /// </summary>
    /// <param name="inXml">从客户端发来请求业务文档</param>
    /// <returns>执行业务逻辑后返回给客户端的业务文档</returns>
    public XmlNode SyncInvoke(XmlNode inXml)
    {
    try
    {
    return new CBizDispense(_BizID).Execute(inXml);
    }
    catch(System.Exception er)
    {
    _ErrMsg=er.Message.ToString();
    System.Diagnostics.Debug.WriteLine(er.Message.ToString());
    throw er;
    }
    }
    /// <summary>
    /// 异步调用业务分发组件的方法
    /// </summary>
    /// <param name="inXml">从客户端发来请求业务文档</param>
    public void AsyncInvoke(XmlNode inXml)
    {
    try
    {
    //远程组件实例(此处没有考虑带帐套的情况!)
    CBizDispense dispense=new CBizDispense(_BizID);
    //将要异步调用的远程组件的方法绑在委托上
    _invokedelegate=new InvokeDelegate(dispense.Execute);
    //定义消息返回的处理方法
    AsyncCallback callback= new AsyncCallback(this.Callback);
    object obj=new Object();
    //发送异步请求
    _invokedelegate.BeginInvoke(inXml,callback,obj);
    }
    catch(System.Exception er)
    {
    _ErrMsg=er.Message.ToString();
    System.Diagnostics.Debug.WriteLine(er.Message.ToString());
    throw er;
    }
    }
    #endregion //公有
    }
      

  2.   


    /// <summary>
    /// CBizBroadcast:处理异步请求返回消息的类,
    /// 负责将异步请求的结果返回给请求者
    /// </summary>
    public class CBizBroadcast
    {
    /*================================================================
     * 成员、构造函数
     ================================================================*/
    #region 
    /// <summary>
    /// 处理多线程异步回调时,处理消息方法的委托,
    /// 由实现此委托方法的对象真正实现消息的处理
    /// </summary>
    private static DBizEventHandler _EventHandler; private static string _ErrMsg;                     //存放出错信息的变量
    /// <summary>
    /// 构造函数
    /// </summary>
    static CBizBroadcast()
    {}
    #endregion
    /*================================================================
     * 方法
     *================================================================*/
    #region
    /// <summary>
    /// 将对象加入消息队列
    /// </summary>
    /// <param name="bizEventHandler"></param>
    public static void AddBoard (DBizEventHandler bizEventHandler)
    {
    try
    {
    _EventHandler -= bizEventHandler;//
    _EventHandler += bizEventHandler;
    }
    catch(System.Exception er)
    {
    System.Diagnostics.Debug.WriteLine(er.Message.ToString());
    _ErrMsg=er.Message.ToString();
    throw er;
    }
    }
    /// <summary>
    /// 从消息队列中移除对象
    /// </summary>
    /// <param name="Sender"></param>
    /// <param name="e"></param>
    public static void RemoveBoard(DBizEventHandler bizEventHandler)
    {
    try
    {
    _EventHandler -= bizEventHandler;
    }
    catch(System.Exception er)
    {
    System.Diagnostics.Debug.WriteLine(er.Message.ToString());
    _ErrMsg=er.Message.ToString();
    throw er;
    }
    }
    /// <summary>
    /// 发送消息的静态方法(消息名称,消息号,需处理的返回文档)
    /// 消息的名称和号与业务场景的名称和号对应
    /// </summary>
    /// <param name="MsgName"></param>
    /// <param name="MsgID"></param>
    /// <param name="ReturnData"></param>
    public static void Send(string msgID, XmlNode xmlData)
    {
    try
    {
    if(_EventHandler!=null)
    _EventHandler(msgID,xmlData);
    }
    catch(System.Exception er)
    {
    System.Diagnostics.Debug.WriteLine(er.Message.ToString());
    _ErrMsg=er.Message.ToString();
    throw er;
    }
    }
    #endregion
    }
    }