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

     引用:https://www.cnblogs.com/dotnet261010/p/6206068.html

    特性一:委托

    委托是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 }
    HK
  • 相关阅读:
    欧拉公式
    isap的一些想法
    错误合集
    Hello World
    PAT (Advanced Level) Practice 1068 Find More Coins
    PAT (Advanced Level) 1087 All Roads Lead to Rome
    PAT (Advanced Level) 1075 PAT Judge
    PAT (Advanced Level) 1067 Sort with Swap(0, i)
    PAT (Advanced Level) 1017 Queueing at Bank
    PAT (Advanced Level) 1025 PAT Ranking
  • 原文地址:https://www.cnblogs.com/HarryK4952/p/14713874.html
Copyright © 2011-2022 走看看