zoukankan      html  css  js  c++  java
  • C#网络编程一:C#网络编程常用特性

    特性一:委托

    委托是C#语言中特有的概念,相当于C/C++中的函数指针,与C/C++中函数指针的不同之处是:委托是面向对象的、类型安全的和保险的,是引用类型。因此,对委托的使用要

    “先定义、后声明,接着实例化、然后作为参数传递给方法,最后才能使用”。

    1、定义委托使用关键字delegate:

    delegate  void SomeDelegate(type1 para1,......typen paran);

    2、声明委托:

    SomeDelegate  d;

    3、实例化委托:

    d=new SomeDelegate(obj.InstanceMethod);

    其中obj是对象,InstanceMethod是它的实例方法。

    4、作为参数传递给方法

    someMethod(d);

    5、最后在此方法的实现代码中使用委托

    private  void  someMethod(SomeDelegate  someDelegate)

    {

       .....

       //使用委托

      someDelegate(arg1,arg2,....,argn);

      ...... 

    }

    通过委托SomeDelegate实现对方法InstanceMethod的调用,调用还必须有一个前提条件:方法InstanceMethod有参数且和定义SomeDelegate的参数一致,并且返回类型相同(本例中为void)。方法InstanceMethod的定义:

    private  void  InstanceMethod(type1 para1,type2 para2,......,typen paran)

    {

       //方法体

      .....

    }

    委托的实例化中的参数既可以是实例方法,也可以是静态方法。

    使用委托实现“文字抄写员”的小程序,界面如下:

    在下方文本框中编辑文字,勾选“书写到”组框中的“文本区1”和(或)“文本区2”复选框后单击“提交”按钮,程序会自动将文本框中的文字“抄写”到对应的用户勾选的文本区中去。

    代码实现如下:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Drawing;
     6 using System.Linq;
     7 using System.Text;
     8 using System.Threading.Tasks;
     9 using System.Windows.Forms;
    10 
    11 namespace DelegateDemo
    12 {
    13     public partial class FrmMain : Form
    14     {
    15         public FrmMain()
    16         {
    17             InitializeComponent();
    18         }
    19 
    20         //1、定义委托
    21         private delegate void WriteToTextBox(string strTxt);
    22         //2、声明委托
    23         private WriteToTextBox writeToTextBox;
    24 
    25         /// <summary>
    26         /// 提交
    27         /// </summary>
    28         /// <param name="sender"></param>
    29         /// <param name="e"></param>
    30         private void btn_OK_Click(object sender, EventArgs e)
    31         {
    32             if (chbOne.Checked)
    33             {
    34                 gbJobOne.Text = "运行中......";
    35                 gbJobOne.Refresh();
    36                 txtJobOne.Clear();
    37                 //3、实例化委托
    38                 writeToTextBox = new WriteToTextBox(WriteTextBox1);
    39                 //4、将委托作为方法的参数进行传递
    40                 WriteText(writeToTextBox);
    41                 gbJobOne.Text = "任务1完成";
    42             }
    43             if (chbTwo.Checked)
    44             {
    45 
    46                 gbJobTwo.Text = "运行中......";
    47                 gbJobTwo.Refresh();
    48                 txtJobTwo.Clear();
    49                 //3、实例化委托
    50                 writeToTextBox = new WriteToTextBox(WriteTextBox2);
    51                 //4、将委托作为方法的参数进行传递
    52                 WriteText(writeToTextBox);
    53                 gbJobTwo.Text = "任务2完成";
    54             }
    55         }
    56 
    57 
    58         private void WriteText(WriteToTextBox writeMethod)
    59         {
    60             string strData = this.txt_Input.Text;
    61             writeMethod(strData);
    62         }
    63         private void WriteTextBox1(string strTxt)
    64         {
    65             this.txtJobOne.Text = strTxt;
    66         }
    67 
    68         private void WriteTextBox2(string strTxt)
    69         {
    70             this.txtJobTwo.Text = strTxt;
    71         }
    72 
    73         /// <summary>
    74         /// 窗体加载事件
    75         /// </summary>
    76         /// <param name="sender"></param>
    77         /// <param name="e"></param>
    78         private void FrmMain_Load(object sender, EventArgs e)
    79         {
    80             //设置文本框获取焦点
    81             this.ActiveControl = this.txt_Input;
    82             //this.txt_Input.Focus();
    83         }
    84     }
    85 }

    特性2:多线程

    多线程的具体介绍请参考博文:http://www.cnblogs.com/dotnet261010/p/6159984.html

    使用多线程实现上一节的程序,代码如下:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.Linq;
      7 using System.Text;
      8 using System.Threading.Tasks;
      9 using System.Windows.Forms;
     10 using System.Threading;//引入多线程的命名空间
     11 
     12 namespace DelegateDemo
     13 {
     14     public partial class FrmMain : Form
     15     {
     16         public FrmMain()
     17         {
     18             InitializeComponent();
     19         }
     20 
     21         //1、定义委托
     22         private delegate void WriteToTextBox(string strTxt);
     23         //2、声明委托
     24         private WriteToTextBox writeToTextBox;
     25 
     26         /// <summary>
     27         /// 提交
     28         /// </summary>
     29         /// <param name="sender"></param>
     30         /// <param name="e"></param>
     31         private void btn_OK_Click(object sender, EventArgs e)
     32         {
     33            //创建线程1
     34             Thread thread1 = new Thread(new ThreadStart(ExecuteTsk1));
     35             //启动线程1
     36             thread1.Start();
     37 
     38             //创建线程2
     39             Thread thread2 = new Thread(new ThreadStart(ExecuteTsk2));
     40             //启动线程2
     41             thread2.Start();
     42            
     43         }
     44 
     45 
     46         private void ExecuteTsk1()
     47         {
     48             if (chbOne.Checked)
     49             {
     50                 gbJobOne.Text = "运行中......";
     51                 gbJobOne.Refresh();
     52                 txtJobOne.Clear();
     53                 //3、实例化委托
     54                 writeToTextBox = new WriteToTextBox(WriteTextBox1);
     55                 //4、将委托作为方法的参数进行传递
     56                 WriteText(writeToTextBox);
     57                 gbJobOne.Text = "任务1完成";
     58             }
     59         }
     60 
     61         private void ExecuteTsk2()
     62         {
     63             if (chbTwo.Checked)
     64             {
     65 
     66                 gbJobTwo.Text = "运行中......";
     67                 gbJobTwo.Refresh();
     68                 txtJobTwo.Clear();
     69                 //3、实例化委托
     70                 writeToTextBox = new WriteToTextBox(WriteTextBox2);
     71                 //4、将委托作为方法的参数进行传递
     72                 WriteText(writeToTextBox);
     73                 gbJobTwo.Text = "任务2完成";
     74             }
     75         }
     76 
     77 
     78         private void WriteText(WriteToTextBox writeMethod)
     79         {
     80             string strData = this.txt_Input.Text;
     81             writeMethod(strData);
     82         }
     83         private void WriteTextBox1(string strTxt)
     84         {
     85             this.txtJobOne.Text = strTxt;
     86         }
     87 
     88         private void WriteTextBox2(string strTxt)
     89         {
     90             this.txtJobTwo.Text = strTxt;
     91         }
     92 
     93         /// <summary>
     94         /// 窗体加载事件
     95         /// </summary>
     96         /// <param name="sender"></param>
     97         /// <param name="e"></param>
     98         private void FrmMain_Load(object sender, EventArgs e)
     99         {
    100             //设置文本框获取焦点
    101             this.ActiveControl = this.txt_Input;
    102             //允许跨线程调用
    103             Control.CheckForIllegalCrossThreadCalls = false;
    104         }
    105     }
    106 }

    特性3:C#方法回调

    C#回调的具体介绍请参照博文:http://www.cnblogs.com/dotnet261010/p/6159984.html

    使用委托、多线程和C#的方法回调机制实现上一节的程序,代码如下:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.Linq;
      7 using System.Text;
      8 using System.Threading.Tasks;
      9 using System.Windows.Forms;
     10 using System.Threading;//引入多线程的命名空间
     11 
     12 namespace DelegateDemo
     13 {
     14     public partial class FrmMain : Form
     15     {
     16         public FrmMain()
     17         {
     18             InitializeComponent();
     19         }
     20 
     21         //1、定义委托
     22         private delegate void WriteToTextBox(string strTxt);
     23         //2、声明委托
     24         private WriteToTextBox writeToTextBox;
     25 
     26         //定义并声明操作文本区1的回调
     27         private delegate void WriteTxtJobOneCallBack(string strValue);
     28         WriteTxtJobOneCallBack writeTxtJobOneCallBack;
     29 
     30         //定义并声明操作文本区2的回调
     31         private delegate void WriteTxtJobTwoCallBack(string strValue);
     32         WriteTxtJobOneCallBack writeTxtJobTwoCallBack;
     33 
     34         //定义并声明操作"任务1"分组框的回调
     35         private delegate void ShowGroupOneCallBack(string strValue);
     36         ShowGroupOneCallBack showGroupOneCallBack;
     37 
     38         //定义并声明操作"任务2"分组框的回调
     39         private delegate void ShowGroupTwoCallBack(string strValue);
     40         ShowGroupOneCallBack showGroupTwoCallBack;
     41 
     42        
     43         
     44         /// <summary>
     45         /// 提交
     46         /// </summary>
     47         /// <param name="sender"></param>
     48         /// <param name="e"></param>
     49         private void btn_OK_Click(object sender, EventArgs e)
     50         {
     51            //创建线程1
     52             Thread thread1 = new Thread(new ThreadStart(ExecuteTsk1));
     53             //启动线程1
     54             thread1.Start();
     55 
     56             //创建线程2
     57             Thread thread2 = new Thread(new ThreadStart(ExecuteTsk2));
     58             //启动线程2
     59             thread2.Start();
     60            
     61         }
     62 
     63 
     64         private void ExecuteTsk1()
     65         {
     66             if (chbOne.Checked)
     67             {
     68                 //3、实例化委托
     69                 writeToTextBox = new WriteToTextBox(WriteTextBox1);
     70                 //4、将委托作为方法的参数进行传递
     71                 WriteText(writeToTextBox);
     72                 //使用回调
     73                 this.gbJobOne.Invoke(showGroupOneCallBack, "任务1");
     74             }
     75         }
     76 
     77         private void ExecuteTsk2()
     78         {
     79             if (chbTwo.Checked)
     80             {
     81                 //3、实例化委托
     82                 writeToTextBox = new WriteToTextBox(WriteTextBox2);
     83                 //4、将委托作为方法的参数进行传递
     84                 WriteText(writeToTextBox);
     85                 //使用回调
     86                 this.gbJobTwo.Invoke(showGroupTwoCallBack, "任务2");
     87             }
     88         }
     89 
     90         /// <summary>
     91         /// 执行自定义委托
     92         /// </summary>
     93         /// <param name="writeMethod"></param>
     94         private void WriteText(WriteToTextBox writeMethod)
     95         {
     96             string strData = this.txt_Input.Text;
     97             writeMethod(strData);
     98         }
     99 
    100         /// <summary>
    101         /// 给文本区1赋值
    102         /// </summary>
    103         /// <param name="strTxt"></param>
    104         private void WriteTextBox1(string strTxt)
    105         {
    106             //使用回调
    107             this.txtJobOne.Invoke(writeTxtJobOneCallBack, strTxt);
    108         }
    109 
    110         /// <summary>
    111         /// 给文本区2赋值
    112         /// </summary>
    113         /// <param name="strTxt"></param>
    114         private void WriteTextBox2(string strTxt)
    115         {
    116             //使用回调
    117             this.txtJobTwo.Invoke(writeTxtJobTwoCallBack, strTxt);
    118         }
    119 
    120         /// <summary>
    121         /// 窗体加载事件
    122         /// </summary>
    123         /// <param name="sender"></param>
    124         /// <param name="e"></param>
    125         private void FrmMain_Load(object sender, EventArgs e)
    126         {
    127             //设置文本框获取焦点
    128             this.ActiveControl = this.txt_Input;
    129             
    130             //实例化回调
    131             writeTxtJobOneCallBack = new WriteTxtJobOneCallBack(WriteToTextJobOne);
    132             writeTxtJobTwoCallBack = new WriteTxtJobOneCallBack(WriteToTextJobTwo);
    133             showGroupOneCallBack = new ShowGroupOneCallBack(ShowGroupOne);
    134             showGroupTwoCallBack = new ShowGroupOneCallBack(ShowGroupTwo);
    135 
    136         }
    137 
    138         /// <summary>
    139         /// 操作文本区1的回调要执行的方法
    140         /// </summary>
    141         /// <param name="strValue"></param>
    142         private void WriteToTextJobOne(string strValue)
    143         {
    144             this.txtJobOne.Text = strValue;
    145         }
    146 
    147         /// <summary>
    148         /// 操作文本区2的回调要执行的方法
    149         /// </summary>
    150         /// <param name="strValue"></param>
    151         private void WriteToTextJobTwo(string strValue)
    152         {
    153             this.txtJobTwo.Text = strValue;
    154         }
    155 
    156         /// <summary>
    157         /// 操作"任务1"分组框的回调要执行的方法
    158         /// </summary>
    159         /// <param name="strValue"></param>
    160         private void ShowGroupOne(string strValue)
    161         {
    162             this.gbJobOne.Text = strValue;
    163         }
    164 
    165         /// <summary>
    166         /// 操作"任务2"分组框的回调要执行的方法
    167         /// </summary>
    168         /// <param name="strValue"></param>
    169         private void ShowGroupTwo(string strValue)
    170         {
    171             this.gbJobTwo.Text = strValue;
    172         }
    173     }
    174 }
  • 相关阅读:
    杜教筛
    GCD Counting Codeforces
    洛谷 P4317 花神的数论题 || bzoj3209
    About set HDU
    Queue Sequence HDU
    bzoj2154||洛谷P1829 Crash的数字表格&&JZPTAB && bzoj3309 DZY Loves Math
    洛谷 P1445 [Violet]樱花
    洛谷 P2158 [SDOI2008]仪仗队 && 洛谷 P1447 [NOI2010]能量采集
    nginx中使用waf防火墙
    wordpress安装
  • 原文地址:https://www.cnblogs.com/dotnet261010/p/6206068.html
Copyright © 2011-2022 走看看