使用命名管道NamedPipe在webform与windows服务之间通信

    在近日开发的一个web项目中,有这么一个需求:一些统计数据需要实时生成,并保存在数据库或文件中。

    可以实现的方法有很多,比如:

    1、在web代码中实现,每一个关联操作之后调用一次统计代码

    2、使用数据库触发器

    3、使用系统自带的计划任务,定时执行

    4、数据库代理定时执行

  5、使用命名管道触发windows服务后台执行

  以上几种方法各有各的好处,也有弊端

  第一种方法,如果统计不耗时,那么对用户影响较小,但如果是耗时操作,则会影响整个WEB的运行

     第二种方法,触发器不便于维护

  第三种和第四种方法的弊端很明显,不能做到实时,而且定时访问数据库也会造成不必要的资源浪费。

  在综合考虑下使用了第五种方法,即在关联操作完成之后,webform通过命名管道发送一个信号给windows服务,由windows服务在后台执行,不仅避免了资源的浪费,而且耗时的操作不会影响前端web的运行。

  关于命名管道的用法请参考MSDN。在此贴出主要代码:

  服务端代码:

 1  while (run)
 2             {
 3                 using (NamedPipeServerStream pipe = new NamedPipeServerStream("pipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 10, 10, ps))
 4                 {                    
 5                     pipe.WaitForConnection();
 6                     string message;
 7                     using (StreamReader sr = new StreamReader(pipe))
 8                     {
 9                         message = sr.ReadToEnd();//message为webform传递过来的指令
10                        //根据指令执行相应的操作    
11                        
12                         switch (message)
13                         {
14                             case "a":
15                                DoSomeThing();
16                                 break;
17                              case "b":
18                                DoSomeThing();
19                                 break;
20                          
21 
22                         }
23                     }
24                     
25                 }
26             }

 

   WEB端代码:

 1 public static void SendPipeMessage(string message)
 2         {
 3             try
 4             {
 5                 using (NamedPipeClientStream pipe = new NamedPipeClientStream(".", "pipe"))
 6                 {
 7                     pipe.Connect(10000);
 8                     using (StreamWriter sr = new StreamWriter(pipe))
 9                     {
10                         sr.AutoFlush = true;
11                         sr.Write(message);
12                     }
13                 }
14             }
15             catch
16             { }
17         }

 

posted on 2014-07-03 15:35  雅牛  阅读(866)  评论(0)    收藏  举报

导航