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”复选框后单击“提交”按钮,程序会自动将文本框中的文字“抄写”到对应的用户勾选的文本区中去。

代码实现如下:

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;

namespace DelegateDemo
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        //1、定义委托
        private delegate void WriteToTextBox(string strTxt);
        //2、声明委托
        private WriteToTextBox writeToTextBox;

        /// <summary>
        /// 提交
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_OK_Click(object sender, EventArgs e)
        {
            if (chbOne.Checked)
            {
                gbJobOne.Text = "运行中......";
                gbJobOne.Refresh();
                txtJobOne.Clear();
                //3、实例化委托
                writeToTextBox = new WriteToTextBox(WriteTextBox1);
                //4、将委托作为方法的参数进行传递
                WriteText(writeToTextBox);
                gbJobOne.Text = "任务1完成";
            }
            if (chbTwo.Checked)
            {

                gbJobTwo.Text = "运行中......";
                gbJobTwo.Refresh();
                txtJobTwo.Clear();
                //3、实例化委托
                writeToTextBox = new WriteToTextBox(WriteTextBox2);
                //4、将委托作为方法的参数进行传递
                WriteText(writeToTextBox);
                gbJobTwo.Text = "任务2完成";
            }
        }

        private void WriteText(WriteToTextBox writeMethod)
        {
            string strData = this.txt_Input.Text;
            writeMethod(strData);
        }
        private void WriteTextBox1(string strTxt)
        {
            this.txtJobOne.Text = strTxt;
        }

        private void WriteTextBox2(string strTxt)
        {
            this.txtJobTwo.Text = strTxt;
        }

        /// <summary>
        /// 窗体加载事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmMain_Load(object sender, EventArgs e)
        {
            //设置文本框获取焦点
            this.ActiveControl = this.txt_Input;
            //this.txt_Input.Focus();
        }
    }
}

特性2:多线程

多线程的具体介绍请参考博文:https://www.jb51.net/article/238731.htm

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

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 System.Threading;//引入多线程的命名空间

namespace DelegateDemo
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        //1、定义委托
        private delegate void WriteToTextBox(string strTxt);
        //2、声明委托
        private WriteToTextBox writeToTextBox;

        /// <summary>
        /// 提交
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_OK_Click(object sender, EventArgs e)
        {
           //创建线程1
            Thread thread1 = new Thread(new ThreadStart(ExecuteTsk1));
            //启动线程1
            thread1.Start();

            //创建线程2
            Thread thread2 = new Thread(new ThreadStart(ExecuteTsk2));
            //启动线程2
            thread2.Start();

        }

        private void ExecuteTsk1()
        {
            if (chbOne.Checked)
            {
                gbJobOne.Text = "运行中......";
                gbJobOne.Refresh();
                txtJobOne.Clear();
                //3、实例化委托
                writeToTextBox = new WriteToTextBox(WriteTextBox1);
                //4、将委托作为方法的参数进行传递
                WriteText(writeToTextBox);
                gbJobOne.Text = "任务1完成";
            }
        }

        private void ExecuteTsk2()
        {
            if (chbTwo.Checked)
            {

                gbJobTwo.Text = "运行中......";
                gbJobTwo.Refresh();
                txtJobTwo.Clear();
                //3、实例化委托
                writeToTextBox = new WriteToTextBox(WriteTextBox2);
                //4、将委托作为方法的参数进行传递
                WriteText(writeToTextBox);
                gbJobTwo.Text = "任务2完成";
            }
        }

        private void WriteText(WriteToTextBox writeMethod)
        {
            string strData = this.txt_Input.Text;
            writeMethod(strData);
        }
        private void WriteTextBox1(string strTxt)
        {
            this.txtJobOne.Text = strTxt;
        }

        private void WriteTextBox2(string strTxt)
        {
            this.txtJobTwo.Text = strTxt;
        }

        /// <summary>
        /// 窗体加载事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmMain_Load(object sender, EventArgs e)
        {
            //设置文本框获取焦点
            this.ActiveControl = this.txt_Input;
            //允许跨线程调用
            Control.CheckForIllegalCrossThreadCalls = false;
        }
    }
}

特性3:C#方法回调

C#回调的具体介绍请参照博文:https://www.jb51.net/article/238731.htm#_label3

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

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 System.Threading;//引入多线程的命名空间

namespace DelegateDemo
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        //1、定义委托
        private delegate void WriteToTextBox(string strTxt);
        //2、声明委托
        private WriteToTextBox writeToTextBox;

        //定义并声明操作文本区1的回调
        private delegate void WriteTxtJobOneCallBack(string strValue);
        WriteTxtJobOneCallBack writeTxtJobOneCallBack;

        //定义并声明操作文本区2的回调
        private delegate void WriteTxtJobTwoCallBack(string strValue);
        WriteTxtJobOneCallBack writeTxtJobTwoCallBack;

        //定义并声明操作"任务1"分组框的回调
        private delegate void ShowGroupOneCallBack(string strValue);
        ShowGroupOneCallBack showGroupOneCallBack;

        //定义并声明操作"任务2"分组框的回调
        private delegate void ShowGroupTwoCallBack(string strValue);
        ShowGroupOneCallBack showGroupTwoCallBack;

        /// <summary>
        /// 提交
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_OK_Click(object sender, EventArgs e)
        {
           //创建线程1
            Thread thread1 = new Thread(new ThreadStart(ExecuteTsk1));
            //启动线程1
            thread1.Start();

            //创建线程2
            Thread thread2 = new Thread(new ThreadStart(ExecuteTsk2));
            //启动线程2
            thread2.Start();

        }

        private void ExecuteTsk1()
        {
            if (chbOne.Checked)
            {
                //3、实例化委托
                writeToTextBox = new WriteToTextBox(WriteTextBox1);
                //4、将委托作为方法的参数进行传递
                WriteText(writeToTextBox);
                //使用回调
                this.gbJobOne.Invoke(showGroupOneCallBack, "任务1");
            }
        }

        private void ExecuteTsk2()
        {
            if (chbTwo.Checked)
            {
                //3、实例化委托
                writeToTextBox = new WriteToTextBox(WriteTextBox2);
                //4、将委托作为方法的参数进行传递
                WriteText(writeToTextBox);
                //使用回调
                this.gbJobTwo.Invoke(showGroupTwoCallBack, "任务2");
            }
        }

        /// <summary>
        /// 执行自定义委托
        /// </summary>
        /// <param name="writeMethod"></param>
        private void WriteText(WriteToTextBox writeMethod)
        {
            string strData = this.txt_Input.Text;
            writeMethod(strData);
        }

        /// <summary>
        /// 给文本区1赋值
        /// </summary>
        /// <param name="strTxt"></param>
        private void WriteTextBox1(string strTxt)
        {
            //使用回调
            this.txtJobOne.Invoke(writeTxtJobOneCallBack, strTxt);
        }

        /// <summary>
        /// 给文本区2赋值
        /// </summary>
        /// <param name="strTxt"></param>
        private void WriteTextBox2(string strTxt)
        {
            //使用回调
            this.txtJobTwo.Invoke(writeTxtJobTwoCallBack, strTxt);
        }

        /// <summary>
        /// 窗体加载事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmMain_Load(object sender, EventArgs e)
        {
            //设置文本框获取焦点
            this.ActiveControl = this.txt_Input;

            //实例化回调
            writeTxtJobOneCallBack = new WriteTxtJobOneCallBack(WriteToTextJobOne);
            writeTxtJobTwoCallBack = new WriteTxtJobOneCallBack(WriteToTextJobTwo);
            showGroupOneCallBack = new ShowGroupOneCallBack(ShowGroupOne);
            showGroupTwoCallBack = new ShowGroupOneCallBack(ShowGroupTwo);

        }

        /// <summary>
        /// 操作文本区1的回调要执行的方法
        /// </summary>
        /// <param name="strValue"></param>
        private void WriteToTextJobOne(string strValue)
        {
            this.txtJobOne.Text = strValue;
        }

        /// <summary>
        /// 操作文本区2的回调要执行的方法
        /// </summary>
        /// <param name="strValue"></param>
        private void WriteToTextJobTwo(string strValue)
        {
            this.txtJobTwo.Text = strValue;
        }

        /// <summary>
        /// 操作"任务1"分组框的回调要执行的方法
        /// </summary>
        /// <param name="strValue"></param>
        private void ShowGroupOne(string strValue)
        {
            this.gbJobOne.Text = strValue;
        }

        /// <summary>
        /// 操作"任务2"分组框的回调要执行的方法
        /// </summary>
        /// <param name="strValue"></param>
        private void ShowGroupTwo(string strValue)
        {
            this.gbJobTwo.Text = strValue;
        }
    }
}

到此这篇关于C#网络编程中常用特性的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • c# 网络编程之http

    一.概述 本文目的是通过C#代码提供一个HTTP服务,正常情况下如果我们需要向外界提供HTTP服务,常规做法就是通过ASP.NET来实现,有时我们的应用程序或Windows服务需要向外提供一些简单的HTTP服务就可以自己实现,从而避免部署IIS增加系统复杂性.这里必须强调是一些简单的应用,如果应用比较复杂,涉及到路径解析HTML解析等,还是用WEB方式实现比较靠谱. 将HTTP和UDP.TCP放在同一个系列实际上有一点不合适,因为UDP.TCP属于传输层协议,HTTP属于应用层协议,希望读者首先

  • 深入学习C#网络编程之HTTP应用编程(下)

    第三篇来的好晚啊,上一篇说了如何向服务器推送信息,这一篇我们看看如何"快好准"的从服务器下拉信息. 网络上有很多大资源文件,比如供人下载的zip包,电影(你懂的),那么我们如何快速的进行下载,大家第一反应肯定就是多线程下载, 那么这些东西是如何做的呢?首先我们可以从"QQ的中转站里面拉一个rar下来". 然后用fiddler监视一下,我们会发现一个有趣的现象: 第一:7.62*1024*1024≈7990914  千真万确是此文件 第二:我明明是一个http链接,t

  • C# 网络编程之UDP

    一.概述 UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NET框架通过UdpClient.TcpListener .TcpClient这几个类对Socket进行了封装,使其使用更加方便, 本文就通过这几个封装过的类讲解一下相关应用. 二.UDP基本应用 与TCP通信不同,UDP通信是不分服务端和客户端的,通信双方是对等的.为了描述方便,我们把通信双方称为发送方和接收方. 发送方: 首先创建一个UDP对象: string locateIP

  • C#网络编程基础之进程和线程详解

    在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下. 一:概念 首先我们要知道什么是"进程",什么是"线程",好,查一下baike. 进程:是一个具有一定独立功能的程序关于某个数据集合的一次活动.它是操作系统动态执行的基本单元, 在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元. 线程:是"进程"中某个单一顺序的控制流. 关于这两个概念,大家稍微有个印象就行了,防止以后被面试官问到. 二:进程

  • c# socket网络编程接收发送数据示例代码

    代码分2块,server端: 复制代码 代码如下: class Program    {        static void Main(string[] args)        {            TcpListener lsner = new TcpListener(9000);            lsner.Start();            Console.WriteLine("started in port: 9000");            while

  • c# 网络编程之tcp

    一.概述 UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NET框架通过UdpClient.TcpListener .TcpClient这几个类对Socket进行了封装,使其使用更加方便, 本文就通过这几个封装过的类讲解一下相关应用. 二.基本应用:连接.发送.接收 服务端建立侦听并等待连接: TcpListener tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"

  • 详解C# 网络编程系列:实现类似QQ的即时通信程序

    引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在本专题中将利用前面专题介绍的知识来实现一个类似QQ的聊天程序.  一.即时通信系统 在我们的生活中经常使用即时通信的软件,我们经常接触到的有:QQ.阿里旺旺.MSN等等.这些都是属于即时通信(Instant Messenger,IM)软件,IM是指所有能够即时发送和接收互联网消息的软件. 在前面专题

  • 浅谈C#网络编程详解篇

    阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层TCP.UDP通信协议的一层封装,通过友好的API暴露出去,方便在进程或多台机器间进行网络通信. Socket编程 在网络编程中分客户端和服务端两种角色,比如通过打开浏览器访问到挂在Web软件上的网页,从程序角度上来看,即客户端(浏览器)发起了一个Socket请求到服务器端,服务器把网页内容返回到浏览

  • 总结C#网络编程中对于Cookie的设定要点

    花了2天时间,彻底搞清C#中cookie的内容,搞清以下内容将让你对所有网站的cookie都尽在掌握之中. cookieCollection是一个针对一个域所有的cookie的集合 cookeContainer是一个容器,里面可以装多个域的cookie的集合,即一个 cookieContainer可以包含多个cookieCollection,这个容器可以定义大小,决定 最多装多少个cookie,如果装满了还要再装,它会自动剔除原来过期的cookie. 再说到一个cookie的结构: Cookie

  • C# Socket网络编程实例

    本文实例讲述了C# Socket网络编程技巧.分享给大家供大家参考.具体分析如下: 客户端要连接服务器:首先要知道服务器的IP地址.而服务器里有很多的应用程序,每一个应用程序对应一个端口号 所以客户端想要与服务器中的某个应用程序进行通信就必须要知道那个应用程序的所在服务器的IP地址,及应用程序所对应的端口号 TCP协议:安全稳定,一般不会发生数据丢失,但是效率低.利用TCP发生数据一般经过3次握手(所有效率低,自己百度三次握手) UDP协议:快速,效率高,但是不稳定,容易发生数据丢失(没有经过三

  • C#开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨

    1.TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议,也有许多的企业应用和互联网应用.http协议在应用层运行. 02,传输层(Tanspot):传输层包括UDP和TCP,UDP几乎不对报文进行检查,而TCP提供传输保证. 03,网络层(Netwok):网络层协议由一系列协议组成,包括ICMP.IGMP.RIP.OSPF.IP(v4,v6)等. 04,链路层(Link):又称为物

  • 深入学习C#网络编程之HTTP应用编程(上)

    我们学习网络编程最熟悉的莫过于Http,好,我们就从Http入手,首先我们肯定要了解一下http的基本原理和作为,对http的工作原理有 一定程度的掌握,对我们下面的学习都是有很大帮助的. 一: 工作方式 ①:client和server建立可靠的TCP连接. ②:然后client通过Socket向server发送http请求. ③:server端处理请求,返回处理数据. ④:在http1.0中,client与server之间的tcp连接立即断开. 但在http1.1中,因为默认支持"tcp的长连

  • C# TcpClient网络编程传输文件的示例

    目录 一.简述 二.内容 一.简述 利用C# TcpClient在局域网内传输文件,可是文件发送到对面的时候却要重新命名文件的.那可不可以连着文件名与文件一起发过去呢? 二.内容 如上图,把文件名字符流的长度的值的字符流(这个文件名字符流长度的值固定是11位的字符串,不足11位前面补0)与文件名的字符流合为一个byte数组然后与文件发送到对面.对面接收后解析出文件名字符流长度的值后,再根据长度解析出文件名,接下来再获取文件流. 服务端 using System; using System.Col

随机推荐