好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

WCF实现进程间管道通信Demo分享

一、代码结构:

二、数据实体类:

?

using system;

using system.collections.generic;

using system.linq;

using system.runtime.serialization;

using system.text;

using system.threading.tasks;

 

namespace datastruct

{

  /// < summary >

  /// 测试数据实体类

  /// </ summary >

  [datacontract]

  public class testdata

  {

   [datamember]

   public double x { get; set; }

 

   [datamember]

   public double y { get; set; }

  }

}

三、服务端服务接口和实现:

接口:

?

using system;

using system.collections.generic;

using system.linq;

using system.servicemodel;

using system.text;

using system.threading.tasks;

using datastruct;

 

namespace wcfserver

{

  /// < summary >

  /// 服务接口

  /// </ summary >

  [servicecontract]

  public interface iclientserver

  {

   /// < summary >

   /// 计算(测试方法)

   /// </ summary >

   [operationcontract]

   double calculate(testdata data);

  }

}

实现:

?

using system;

using system.collections.generic;

using system.linq;

using system.servicemodel;

using system.text;

using system.threading.tasks;

using datastruct;

 

namespace wcfserver

{

  /// < summary >

  /// 服务实现

  /// </ summary >

  [servicebehavior()]

  public class clientserver : iclientserver

  {

   /// < summary >

   /// 计算(测试方法)

   /// </ summary >

   public double calculate(testdata data)

   {

    return math.pow(data.x, data.y);

   }

  }

}

四、服务端启动服务:

?

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.servicemodel;

using system.servicemodel.description;

using system.text;

using system.threading.tasks;

using system.windows.forms;

using utils;

using wcfserver;

 

namespace 服务端

{

  public partial class form1 : form

  {

   public form1()

   {

    initializecomponent();

   }

 

   private void form1_load(object sender, eventargs e)

   {

    backwork.run(() =>

    {

     openclientserver();

    }, null, (ex) =>

    {

     messagebox.show(ex.message);

    });

   }

 

   /// < summary >

   /// 启动服务

   /// </ summary >

   private void openclientserver()

   {

    netnamedpipebinding wshttp = new netnamedpipebinding();

    wshttp.maxbufferpoolsize = 524288;

    wshttp.maxreceivedmessagesize = 2147483647;

    wshttp.readerquotas.maxarraylength = 6553600;

    wshttp.readerquotas.maxstringcontentlength = 2147483647;

    wshttp.readerquotas.maxbytesperread = 6553600;

    wshttp.readerquotas.maxdepth = 6553600;

    wshttp.readerquotas.maxnametablecharcount = 6553600;

    wshttp.closetimeout = new timespan(0, 1, 0);

    wshttp.opentimeout = new timespan(0, 1, 0);

    wshttp.receivetimeout = new timespan(0, 10, 0);

    wshttp.sendtimeout = new timespan(0, 10, 0);

    wshttp.security.mode = netnamedpipesecuritymode.none;

 

    uri baseaddress = new uri("net.pipe://localhost/pipename1");

    servicehost host = new servicehost(typeof(clientserver), baseaddress);

 

    servicemetadatabehavior smb = new servicemetadatabehavior();

    host.description.behaviors.add(smb);

 

    servicebehaviorattribute sba = host.description.behaviors.find< servicebehaviorattribute >();

    sba.maxitemsinobjectgraph = 2147483647;

 

    host.addserviceendpoint(typeof(iclientserver), wshttp, "");

 

    host.open();

   }

  }

}

五、客户端数据实体类和服务接口类与服务端相同

六、客户端服务实现:

?

using datastruct;

using system;

using system.collections.generic;

using system.linq;

using system.servicemodel;

using system.servicemodel.description;

using system.text;

using system.threading.tasks;

using wcfserver;

 

namespace dataservice

{

  /// < summary >

  /// 服务实现

  /// </ summary >

  public class clientserver : iclientserver

  {

   channelfactory< iclientserver > channelfactory;

   iclientserver proxy;

 

   public clientserver()

   {

    createchannel();

   }

 

   /// < summary >

   /// 创建连接客户终端wcf服务的通道

   /// </ summary >

   public void createchannel()

   {

    string url = "net.pipe://localhost/pipename1";

    netnamedpipebinding wshttp = new netnamedpipebinding();

    wshttp.maxbufferpoolsize = 524288;

    wshttp.maxreceivedmessagesize = 2147483647;

    wshttp.readerquotas.maxarraylength = 6553600;

    wshttp.readerquotas.maxstringcontentlength = 2147483647;

    wshttp.readerquotas.maxbytesperread = 6553600;

    wshttp.readerquotas.maxdepth = 6553600;

    wshttp.readerquotas.maxnametablecharcount = 6553600;

    wshttp.sendtimeout = new timespan(0, 10, 0);

    wshttp.security.mode = netnamedpipesecuritymode.none;

 

    channelfactory = new channelfactory< iclientserver >(wshttp, url);

    foreach (operationdescription op in channelfactory.endpoint.contract.operations)

    {

     datacontractserializeroperationbehavior datacontractbehavior = op.behaviors.find< datacontractserializeroperationbehavior >() as datacontractserializeroperationbehavior;

 

     if (datacontractbehavior != null)

     {

      datacontractbehavior.maxitemsinobjectgraph = 2147483647;

     }

    }

   }

 

   /// < summary >

   /// 计算(测试方法)

   /// </ summary >

   public double calculate(testdata data)

   {

    proxy = channelfactory.createchannel();

 

    try

    {

     return proxy.calculate(data);

    }

    catch (exception ex)

    {

     throw ex;

    }

    finally

    {

     (proxy as icommunicationobject).close();

    }

   }

  }

}

七、客户端调用服务接口:

?

using dataservice;

using datastruct;

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.threading.tasks;

using system.windows.forms;

using utils;

using wcfserver;

 

namespace 客户端

{

  public partial class form1 : form

  {

   public form1()

   {

    initializecomponent();

   }

 

   //测试1

   private void button1_click(object sender, eventargs e)

   {

    button1.enabled = false;

    txtsum.text = string.empty;

 

    iclientserver client = new clientserver();

    double num1;

    double num2;

    double sum = 0;

    if (double.tryparse(txtnum1.text, out num1) && double.tryparse(txtnum2.text, out num2))

    {

     datetime dt = datetime.now;

     backwork.run(() =>

     {

      sum = client.calculate(new testdata(num1, num2));

     }, () =>

     {

      double time = datetime.now.subtract(dt).totalseconds;

      txttime.text = time.tostring();

      txtsum.text = sum.tostring();

      button1.enabled = true;

     }, (ex) =>

     {

      button1.enabled = true;

      messagebox.show(ex.message);

     });

    }

    else

    {

     button1.enabled = true;

     messagebox.show("请输入合法的数据");

    }

   }

 

   //测试2

   private void button2_click(object sender, eventargs e)

   {

    button2.enabled = false;

    txtsum.text = string.empty;

 

    iclientserver client = new clientserver();

    double num1;

    double num2;

    double sum = 0;

    if (double.tryparse(txtnum1.text, out num1) && double.tryparse(txtnum2.text, out num2))

    {

     datetime dt = datetime.now;

     backwork.run(() =>

     {

      for (int i = 0; i < 1000 ; i++)

      {

       sum = client .calculate(new testdata(num1, num2));

      }

     }, () =>

     {

      double time = datetime.now.subtract(dt).totalseconds;

      txttime.text = time.tostring();

      txtsum.text = sum.tostring();

      button2.enabled = true;

     }, (ex) =>

     {

      button2.enabled = true;

      messagebox.show(ex.message);

     });

    }

    else

    {

     button2.enabled = true;

     messagebox.show("请输入合法的数据");

    }

   }

  }

}

八、工具类backwork类:

?

using system;

using system.collections.generic;

using system.componentmodel;

using system.linq;

using system.text;

 

/**

  * 使用方法:

 

backwork.run(() => //dowork

{

 

}, () => //runworkercompleted

{

 

}, (ex) => //错误处理

{

 

});

 

*/

 

namespace utils

{

  /// < summary >

  /// backgroundworker封装

  /// 用于简化代码

  /// </ summary >

  public class backwork

  {

   /// < summary >

   /// 执行

   /// </ summary >

   /// < param name = "dowork" >dowork</ param >

   /// < param name = "workcompleted" >runworkercompleted</ param >

   /// < param name = "erroraction" >错误处理</ param >

   public static void run(action dowork, action workcompleted, action< exception > erroraction)

   {

    bool isdoworkerror = false;

    exception doworkexception = null;

    backgroundworker worker = new backgroundworker();

    worker.dowork += (s, e) =>

    {

     try

     {

      dowork();

     }

     catch (exception ex)

     {

      isdoworkerror = true;

      doworkexception = ex;

     }

    };

    worker.runworkercompleted += (s, e) =>

    {

     if (!isdoworkerror)

     {

      try

      {

       if (workcompleted != null) workcompleted();

      }

      catch (exception ex)

      {

       erroraction(ex);

      }

     }

     else

     {

      erroraction(doworkexception);

     }

    };

    worker.runworkerasync();

   }

 

  }

}

九、效果图示:

以上这篇wcf实现进程间管道通信demo分享就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:http://www.cnblogs.com/s0611163/archive/2017/12/15/8043157.html

dy("nrwz");

查看更多关于WCF实现进程间管道通信Demo分享的详细内容...

  阅读:46次