程序 A、B、C,A是系统内核程序,负责权限管理、系统配置等操作,B and C是实现具体功能的应用程序。    为了提高效率,A、B、C这三个程序中使用了缓存技术,例如:第一次从"系统配置"表中检索出数据后,将结果提交给静态变量"X"(HashTable类型),下次再访问"系统配置'的数据就从静态变量"X"中直接读取。    问题来了,用户通过程序A修改系统配置后,程序B、C各自的静态变量"X"没有被更新,B、C就无法按照A修改后的系统配置执行。    解决这个问题需要程序A、B、C共享一份缓存数据,请问该用什么方法实现?效率如何?解决后马上给分!!!

解决方案 »

  1.   

    你可以当"程序A修改系统配置"时,发个消息到消息队列,程序B,C每隔一段时间检测一下,发现消息就更新静态变量
      

  2.   

    修改配置的同时更新hashtable就应该可以了
      

  3.   

    hb3000(木林)、lookatliu(独孤常败)、lzyuqiang(Pappas)
    首先谢谢你们的回答,你们可能还没看清题目的意思,首先A、B、C三个程序有各自的缓存(Hashtable变量),程序A修改系统配置后当然要刷新自身的缓存,但是却无法刷新程序B和C的缓存,因为他们不是一个程序,各自的变量也是相互独立无法控制的。
    cenchure(达到)、livode(啊水)
    谢谢你们,这正是我所想的结果。请问,消息队列或者事件通知的效率如何?事件通知的功能好像挺强啊。最重要的是他们怎么实现,麻烦再说明一下。
      

  4.   

    A、B、C 的HashTable 不是同一个类里面的同一个static变量嘛??
      

  5.   

    我只会用WM_COPYDATA在2个窗口间传递消息,如果你认为可用,我可以发个sample给你
      

  6.   

    与其每隔一段时间取消息队列,不如在"系统配置"表中加入ModifiedOn字段,程序每隔一段时间就扫描一下这个表,如果发现表中的ModifiedOn比缓存中时间新,就更新,无论怎么做,也逃不过定时轮询
      

  7.   

    建一个代理和声明一个事件,当修改A的时候,引发事件,在B里面处理事件,而且处理代码就是修改缓存数据。同样在B里面也可以声明一个事件来让C来处理它自己的缓存。或者直接在B、C里面注册A的事件,然后处理事件了。
      

  8.   

    用消息队列并不好!那要用到系统API了。调用烦琐而且不安全,容易出错。
      

  9.   

    lookatliu(独孤常败),是同一个dll文件的同一个类的同一个static变量,但是在各自程序里运行的时候这个static变量被分成了3份,相互独立的,不知道我说的是否明白。另外,WM_COPYDATA可能用不上,因为我的程序没有窗体,全都是在后台运行的类库:(((zhongkeruanjian(编程亮子),这个方法也不太合适,因为除了系统配置变量以外,还有“用户权限”等数据需要缓存,通过在表中架字段的方法设计起来就太麻烦了。而且我做的是B/S结构程序,还解决不了实时的问题。GXY2005(不好!我看見豬在天上飛),谢谢,能否给个C#的消息队列的例子?wydcs(天外来痴),能否给个例子呢?我对C#的设计模式不是特别了解。谢谢谢谢啦~多谢大家支持,再帮帮忙,我现在有一个临时的解决办法。重新启动服务器
      

  10.   

    wydcs(天外来痴),如何实现不同应用程序之间的代理和事件声明?而且最好能灵活一些,因为有N多的程序,不只是A、B、C三个
      

  11.   

    用我的方法吧,写一个类,定义一些静态变量,这些变量在内存中的地址是固定的。使用的时候不用实例化这个类,直接用就可以。如下面这个类:
    using System;
    /// <summary>
    /// Gobal 的摘要说明。
    /// </summary>
    public class Gobal
    {

    public static string user;//用户名
    public static string ipaddress;//ip地址
    public static string port;//端口
    public Gobal()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    }
    用user的时候直接Gobal.user,而不用Gobal gg=new Gobal();,这样,无论你在那里用Gobal.user,都是统一的。
      

  12.   

    我一直以为是Windows程序呢……hoho
    lz要不再弄个Web services进行配置和读取,如何?
      

  13.   

    通过在表中架字段的方法设计起来就太麻烦了晕死。。ModifiedOn是数据库表的通用字段啊。。
      

  14.   

    难道数据库表设计的时候,如果是可修改的表,ModifiedOn这个字段都没有?
      

  15.   

    TheRule(绝非偶然),好,那我测试一下!还有,你所说的“常驻内存的东东”该怎么写?lookatliu(独孤常败),嘿嘿,是Windows程序,只不过没有界面而已。zhongkeruanjian(编程亮子),哦,这我还真不清楚,请问SQLServer、MySQL、Oracle所有常用的数据库有这个字段吗?
      

  16.   

    serversql(啊初),呵呵,一语道破玄机,remoting不仅适用于同一台计算机的多个应用程序,而且适用于分布式应用程序。好,我先看看能否解决现在的问题。
      

  17.   

    在通一台服务器中使用remoting效率会不会很低?因为要通过HTTP协议实现。
      

  18.   

    为了提高效率,A、B、C这三个程序中使用了缓存技术,例如:第一次从"系统配置"表中检索出数据后,将结果提交给静态变量"X"(HashTable类型),下次再访问"系统配置'的数据就从静态变量"X"中直接读取。其实我觉得楼主把"静态变量X"这几个字改成"配置文件(表)"或者"保存设置的处所"就可以了.
      

  19.   

    这样效率是差了点,而且看起来有点笨.
    不过只要能实现目标,差点又有什么不可以呢?!另外,在<<WINDOWS核心编程>>里面似乎讲到了一种叫内存映射文件的技术.
      

  20.   


    楼主,
    你设计的思路跟偶一样,有一些不同的是,
    偶不是用静态变量,而是A、B、C各有一个public 的 Table 型的属性(A、B、C继续自同一interface),A是主程序,由A调用B、C,调用时把这个public的属性传给B、C,由于是引用类型,所以他们实际指向同一个Table,只需维护一份table。
      

  21.   

    没有弄清楚楼主怎么会把它们弄成几个程序。就算是几个程序,在.NET下,也可以这么做,就是另一个程序动态加载另外几个程序,这样程序就可以直接跨Assembly访问……
      

  22.   

    楼主多给分,我把我的一个消息队列测试例子给你:
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;namespace MessageQ
    {
    /// <summary>
    /// Form1 的摘要说明。
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    private System.Messaging.MessageQueue helpRequestQueue;
    private System.Windows.Forms.Label label1;
    private System.Windows.Forms.TextBox txtName;
    private System.Windows.Forms.Label label2;
    private System.Windows.Forms.TextBox txtMessage;
    private System.Windows.Forms.Button sendMessage;
    private System.Windows.Forms.Button refreshMessages;
    private System.Windows.Forms.Button purgeMessages;
    private System.Windows.Forms.CheckBox highPriority;
    private System.Windows.Forms.DataGrid messageGrid;
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.Button button2;
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null; public Form1()
    {
    //
    // Windows 窗体设计器支持所必需的
    //
    InitializeComponent(); //
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
    //
    } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if (components != null) 
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    } #region Windows 窗体设计器生成的代码
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    this.helpRequestQueue = new System.Messaging.MessageQueue();
    this.label1 = new System.Windows.Forms.Label();
    this.txtName = new System.Windows.Forms.TextBox();
    this.label2 = new System.Windows.Forms.Label();
    this.txtMessage = new System.Windows.Forms.TextBox();
    this.sendMessage = new System.Windows.Forms.Button();
    this.refreshMessages = new System.Windows.Forms.Button();
    this.purgeMessages = new System.Windows.Forms.Button();
    this.highPriority = new System.Windows.Forms.CheckBox();
    this.messageGrid = new System.Windows.Forms.DataGrid();
    this.button1 = new System.Windows.Forms.Button();
    this.button2 = new System.Windows.Forms.Button();
    ((System.ComponentModel.ISupportInitialize)(this.messageGrid)).BeginInit();
    this.SuspendLayout();
    // 
    // helpRequestQueue
    // 
    this.helpRequestQueue.MessageReadPropertyFilter.Priority = true;
    this.helpRequestQueue.Path = "FormatName:DIRECT=OS:gaoxiaoyong\\private$\\helprequest";
    this.helpRequestQueue.SynchronizingObject = this;
    // 
    // label1
    // 
    this.label1.Location = new System.Drawing.Point(16, 328);
    this.label1.Name = "label1";
    this.label1.Size = new System.Drawing.Size(40, 16);
    this.label1.TabIndex = 0;
    this.label1.Text = "名称:";
    // 
    // txtName
    // 
    this.txtName.Location = new System.Drawing.Point(64, 328);
    this.txtName.Name = "txtName";
    this.txtName.Size = new System.Drawing.Size(96, 21);
    this.txtName.TabIndex = 1;
    this.txtName.Text = "";
    // 
    // label2
    // 
    this.label2.Location = new System.Drawing.Point(192, 328);
    this.label2.Name = "label2";
    this.label2.Size = new System.Drawing.Size(48, 16);
    this.label2.TabIndex = 2;
    this.label2.Text = "消息:";
    // 
    // txtMessage
    // 
    this.txtMessage.Location = new System.Drawing.Point(248, 328);
    this.txtMessage.Multiline = true;
    this.txtMessage.Name = "txtMessage";
    this.txtMessage.Size = new System.Drawing.Size(384, 72);
    this.txtMessage.TabIndex = 3;
    this.txtMessage.Text = "";
    // 
    // sendMessage
    // 
    this.sendMessage.Location = new System.Drawing.Point(344, 416);
    this.sendMessage.Name = "sendMessage";
    this.sendMessage.Size = new System.Drawing.Size(80, 24);
    this.sendMessage.TabIndex = 4;
    this.sendMessage.Text = "发送消息";
    this.sendMessage.Click += new System.EventHandler(this.sendMessage_Click);
    // 
    // refreshMessages
    // 
    this.refreshMessages.Location = new System.Drawing.Point(448, 416);
    this.refreshMessages.Name = "refreshMessages";
    this.refreshMessages.Size = new System.Drawing.Size(80, 24);
    this.refreshMessages.TabIndex = 5;
    this.refreshMessages.Text = "刷新消息列表";
    this.refreshMessages.Click += new System.EventHandler(this.refreshMessages_Click);
    // 
    // purgeMessages
    // 
    this.purgeMessages.Location = new System.Drawing.Point(552, 416);
    this.purgeMessages.Name = "purgeMessages";
    this.purgeMessages.Size = new System.Drawing.Size(80, 24);
    this.purgeMessages.TabIndex = 6;
    this.purgeMessages.Text = "清除消息列表";
    this.purgeMessages.Click += new System.EventHandler(this.purgeMessages_Click);
    // 
    // highPriority
    // 
    this.highPriority.Location = new System.Drawing.Point(24, 368);
    this.highPriority.Name = "highPriority";
    this.highPriority.Size = new System.Drawing.Size(88, 16);
    this.highPriority.TabIndex = 7;
    this.highPriority.Text = "高优先级";
    // 
    // messageGrid
    // 
    this.messageGrid.DataMember = "";
    this.messageGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText;
    this.messageGrid.Location = new System.Drawing.Point(16, 16);
    this.messageGrid.Name = "messageGrid";
    this.messageGrid.Size = new System.Drawing.Size(616, 296);
    this.messageGrid.TabIndex = 8;
    // 
    // button1
    // 
    this.button1.Location = new System.Drawing.Point(32, 416);
    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(112, 24);
    this.button1.TabIndex = 9;
    this.button1.Text = "利用代码创建队列";
    this.button1.Click += new System.EventHandler(this.button1_Click);
    // 
    // button2
    // 
    this.button2.Location = new System.Drawing.Point(160, 416);
    this.button2.Name = "button2";
    this.button2.Size = new System.Drawing.Size(64, 24);
    this.button2.TabIndex = 10;
    this.button2.Text = "清除";
    this.button2.Click += new System.EventHandler(this.button2_Click);
    // 
    // Form1
    // 
    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
    this.ClientSize = new System.Drawing.Size(648, 453);
    this.Controls.Add(this.button2);
    this.Controls.Add(this.button1);
    this.Controls.Add(this.messageGrid);
    this.Controls.Add(this.highPriority);
    this.Controls.Add(this.purgeMessages);
    this.Controls.Add(this.refreshMessages);
    this.Controls.Add(this.sendMessage);
    this.Controls.Add(this.txtMessage);
    this.Controls.Add(this.label2);
    this.Controls.Add(this.txtName);
    this.Controls.Add(this.label1);
    this.Name = "Form1";
    this.Text = "Form1";
    this.Load += new System.EventHandler(this.Form1_Load);
    ((System.ComponentModel.ISupportInitialize)(this.messageGrid)).EndInit();
    this.ResumeLayout(false); }
    #endregion /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main() 
    {
    Application.Run(new Form1());
    }
      

  23.   

    private void sendMessage_Click(object sender, System.EventArgs e)
    {
    System.Messaging.Message theMessage = 
    new System.Messaging.Message(txtMessage.Text);
    theMessage.Label = txtName.Text; 
    if (highPriority.Checked)
    theMessage.Priority = System.Messaging.MessagePriority.Highest;
    else
    theMessage.Priority = System.Messaging.MessagePriority.Normal;
    helpRequestQueue.Send(theMessage);
    DisplayMessages(); }
    private void DisplayMessages()
    {
    DataTable messageTable = new DataTable();
    messageTable.Columns.Add("Name");
    messageTable.Columns.Add("Message");
    messageTable.Columns.Add("Priority");
    System.Messaging.Message[] messages;
    messages = helpRequestQueue.GetAllMessages();
    System.Messaging.XmlMessageFormatter stringFormatter;
    stringFormatter = new System.Messaging.XmlMessageFormatter(
    new string[] {"System.String"});
    for (int index = 0; index < messages.Length; index++) 
    {
    messages[index].Formatter = stringFormatter;
    messageTable.Rows.Add(new string[] {
       messages[index].Label,
       messages[index].Body.ToString(),
       messages[index].Priority.ToString() });
    }
    messageGrid.DataSource = messageTable;
    }
    private void DisplayMessages2()
    {
    try
     {
     DataTable messageTable = new DataTable();
     messageTable.Columns.Add("Name");
     messageTable.Columns.Add("Message");
     messageTable.Columns.Add("Priority");
     System.Messaging.Message[] messages;
     messages = MyPrivateQueue.GetAllMessages();
     System.Messaging.XmlMessageFormatter stringFormatter;
     stringFormatter = new System.Messaging.XmlMessageFormatter(
     new string[] {"System.String"});
     for (int index = 0; index < messages.Length; index++) 
     {
     messages[index].Formatter = stringFormatter;
     messageTable.Rows.Add(new string[] {
    messages[index].Label,
    messages[index].Body.ToString(),
    messages[index].Priority.ToString() });
     }
     messageGrid.DataSource = messageTable;}
     catch(Exception ex)
     {
    MessageBox.Show(ex.Message);
     }
    }
    private void refreshMessages_Click(object sender, System.EventArgs e)
    {
    DisplayMessages(); } private void purgeMessages_Click(object sender, System.EventArgs e)
    {
    helpRequestQueue.Purge();
    DisplayMessages(); } private void button1_Click(object sender, System.EventArgs e)
    {

    try
    {
    System.Messaging.Message theMessage = 
    new System.Messaging.Message(txtMessage.Text);
    theMessage.Label = txtName.Text; 
    if (highPriority.Checked)
    theMessage.Priority = System.Messaging.MessagePriority.Highest;
    else
    theMessage.Priority = System.Messaging.MessagePriority.Normal;
    MyPrivateQueue.Send(theMessage);
    DisplayMessages2();}
    catch(Exception ex)
    {
    MessageBox.Show(ex.Message);
    } }
    System.Messaging.MessageQueue MyPrivateQueue;
    private void Form1_Load(object sender, System.EventArgs e)
    {
    try
    {
    // System.Messaging.MessageQueue.Create(@".\Private$\MyPrivateQueue");
    MyPrivateQueue = 
    new System.Messaging.MessageQueue(@".\Private$\MyPrivateQueue");
    MyPrivateQueue.MessageReadPropertyFilter.Priority=true;
    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
    } private void button2_Click(object sender, System.EventArgs e)
    {
    MyPrivateQueue.Purge();
    DisplayMessages2();

    } }
    }
      

  24.   

    首先,谢谢大家的关注!    xrwang(无涯),B/S结构访问量很大,用你说的方式效率可能太低了,不如直接从数据库里读。    这样说吧,我做的B/S应用,整个系统结构如下:
        1. 系统内核(底层类库或者叫框架,它包含WebUI、多数据库支持、用户、部门、权限、系统配置、系统集成等所有通用功能的底层类)
        2. 系统内核应用程序(负责通用功能的管理)
        3. 应用程序A(例如OA)
        4. 应用程序B(例如库存)
        5. 应用程序C(例如CRM)
        6. 应用程序D(例如内外网CMS)
        N. ...
        所有的应用程序包括"系统内核应用程序"在内都要引用底层类库,我想在底层类库中实现数据缓存功能。    yuesongboy(可极),数据缓存能否跨应用程序呢?    leo2003【健者天行】,谢谢,你的思路我差不多理解了,但我对C#不是很熟,能否贴一份演示代码?    Ivony(),我做的是系统,不是独立的应用程序,所以分为多个应用程序是必要的。不知道你说的程序动态加载方法在我的框架结构里能否实现?我对C#了解得不够透彻,请指教。    GXY2005(不好!我看見豬在天上飛),呵呵,谢谢支持啊。我先测试一下,解决后一定加分!每个人都少不了!我会多发几个帖子的!    TheRule(绝非偶然),你给的代码我测试了,在一个应用程序中是可以的,但还是无法跨应用程序,你所说的“常驻内存的东东”应该如何实现?
        大家再帮帮忙,不够我可以再发帖子加分!
        我希望大家一起讨论个比较完美的解决方案,最好把分布式应用程序的解决方案也讨论出来。做两套方案,第一:单机多应用程序,第二:分布式应用程序。然后做成底层类库,以后用起来就方便了。
      

  25.   

    GXY2005(不好!我看見豬在天上飛),消息队列的效率可能太低了。
      

  26.   

    fkphp(桔子),那还不如直接读数据库呢,读取硬盘文件再分析XML,效率也不高。必须直接从内存里读数据。wls12342004(青青子木),你指的消息发送怎么做?
      

  27.   


    楼主是web form,不知楼主是怎样调出各应用程序B、C的。
    偶是Win From,是程序(框架)A是Exe,各应用程序如B、C都编译成DLL,调用时动态装载各DLL。
    偶的代码,希望对楼主有用:1.定义一个类(e.g:名为SysUser),类包括你想保存的各种属性
      private class SysUser{}2.在主程序A中实例化 SysUser:_loginUser ;
      private SysUser _loginUser ;
      ......3.在主程序A的ShowForm方法(调用别的DLL,如B、C)中,传递已实例化的_loginUser变量。
      由于_loginUser是引用类型, B、C和A都指向同一内存地址。
      frmB.LoginUser = this._loginUser;//在frmB的内部就可能使用LoginUser的值了。
      

  28.   

    leo2003,谢谢,你的方法肯定是不行了。web form和win form在数据传递中还是有很大差别的。实际上web form窗体之间不可能直接通过变量赋值的方法传递数据。    通过这个地址启动内核应用程序A:http://localhost/A/index.aspx
        通过这个地址启动应用程序B:http://localhost/B/index.aspx    在VS.NET中,A和B是两个不同的项目,他们的共同点是调用了内核的类库文件(就叫他Core.dll吧),Core.dll里封装了“系统配置”的缓存处理。    当时我只是简单的认为把数据缓存做成静态变量就可以,测试后发现这个静态变量实际上只是在单一的应用程序中共享的,应用程序之间并不共享。    刚才搜索了老半天发现P/Invoke可以实现管道,好像能时间进程间的数据通信,我想用这个方法试试,能否一块想个办法?
      

  29.   

    有个笨办法用windows剪切板做,记录上次更新系统配置的时间。
      

  30.   

    你可以尝试AppDomain.CurrentDomain.GetAssemblies方法来试试看能不能访问到其他应用程序的Assembly
      

  31.   

    还是用Remoting吧,Singleton模式的远程对象,永远只有一份拷贝。
      

  32.   

    SQL server 2005 Service Broker. 更好的消息队列
      

  33.   

    用unsafe代码,调用windows的api函数,创建1个文件到内存映射(c#的保存的配置一定要用结构),再把从文件映射到内存的数据,强制转化成结构就好了
    public struct test
    {
       public int data
    }
    public unsafe void test( byte[] buffer )//buffer从文件映射到内存的数据
    {
       fixed ( byte *pdata = &buffer[0] )
       {
    test *t = (test *)pdata;
       }
    }
      

  34.   

    数据共享不如数据访问(存取方式)共享,数据在表中,本身就是共享的,只是访问时不同步,只要创建同步的机制就可以了。这与具体的应用体系结果相关。据两个典型的例子,本地的单独的3个进程,访问效率较好的的方式内存映像文件。三个远程/网络的如网站形式,可使用web service,建立一个数据共享的服务。效率方面需要按具体的应用结果而定。
                                                    ChinsesLiuxm
      

  35.   

    楼主试试这个笨,但简单的办法:
    在B,C中各建一个refresh.aspx,专门负责刷新HashTable,每次A程序修改配置后,建一个webclient对象,用这个对象调用B和C中refresh.aspx。
      

  36.   

    楼上的方法应该可行。或通过webservice来更新。
      

  37.   

    用Google搜这三篇文章:1、Use Data Caching Techniques to Boost Performance and Ensure Synchronization2、Synchronizing the ASP.NET Cache across AppDomains and Web Farms3、DevGlobalCache – A way to Cache and Share data between processes
      

  38.   

    呵呵,先感谢大家!看来问题就快解决了。解决后我会发几篇加分的帖子,每位参与讨论的朋友都有份,这篇帖子我不想结了,留着继续讨论。hexuliang(hexuliang),Remoting我看过大体介绍,只是考虑到调用http协议的效率问题,所以不敢尝试。但分布式应用程序除了WebService就是Remoting吧,相比较Remoting更直接一些。lbaby(星稀.月明.风高.宜私奔),很遗憾,C#是托管代码,所以没有共享内存,只能调用系统API实现。sawam(sawam),内存映射,嗯,是一个办法,DevGlobalCache是不是这么做的?ChineseLiuxm(游侠),嗯,思路基本确定了。内存映射文件和WebService/Remoting。JackyBrown(JackyBrown),呵呵,刷新的办法我一开始也想过了,只是觉得还有完美解决方案。jianyi0115(随意),嗯,又是WebServicesdwf(学习.NET中),谢啦,DevGlobalCache我昨天找到了,再看看其他的。
      

  39.   

    用Webservice可以多个应用程序共享
      

  40.   

    微软的MSDN提供了一个EnterpriseLibrary,其中有关Cache的内容对你可能有用,他有源码有Sample。在同一台机器上,TcpChannel的效率和稳定性应该好于WebService。我目前采用的解决方案就涉及到多应用的共享数据问题。共享内存的方式也考虑过,但是管理困难,需要自己做很多改变。
      

  41.   

    不知道 Singleton 单例模式对你有没有帮助。
    可以去看看。
      

  42.   


    大家说说,有没有讲数据共享, .net remoting 比较好的书籍/文章啊.
    谢谢!
      

  43.   

    刚才看了下《WINDOWS核心编程》,里面讲道
    “如果互相进行通信的所有进程在同一台计算机上,上面提到的所有机制(注:包括RPC、COM、OLE、DDE、窗口消息、剪贴板、邮箱、管道和套接字)均使用内存映射文件从事他们的烦琐工作。如果要求达到较高的性能和较小的开销,内存映射文件是举手可得的最佳机制。”(BY Jeffrey Richter)
    上面还有一个使用内存映射文件通信的例子,主要用到了下列API函数:
    CreateFileMapping    创建内存映射文件
    CloseHandle          关闭返回句柄的任何对象
    MapViewOfFile        在本线程的地址空间建立内存映射文件的视图
    UnmapViewOfFile      与上面相反
    OpenFileMapping      打开一个内存映射文件
    还好不太多,一个一个DLLIMPORT也不是特别麻烦。如果不在同一台计算机,用WEB SERVICE估计比较方便,效率可能就不太高了。
      

  44.   

    Enterprise Library,其中Cache的IsolatedStorageBackingStore不知其原理是什么?放到当前用户的临时目录中的话,多台机器时如何共享?
      

  45.   

    在同一台机器一样能用WebService,我做项目经常要把客户端服务器端装在一起测
      

  46.   

    各位!单机多应用程序准备用内存映射文件!分布式应用程序就用WebService!
    我正在写类库。