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”复选框后单击“提交”按钮,程序会自动将文本框中的文字“抄写”到对应的用户勾选的文本区中去。
代码实现如下:
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:多线程
多线程的具体介绍请参考博文:http://www.cnblogs.com/dotnet261010/p/6159984.html
使用多线程实现上一节的程序,代码如下:
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#回调的具体介绍请参照博文:http://www.cnblogs.com/dotnet261010/p/6159984.html
使用委托、多线程和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#网络编程一:C#网络编程常用特性的更多相关文章
- vxworks下网络编程一:网络字节序问题
inet_addr("192.168.1.1");//返回网络字节序整型ip地址inet_ntoa(saddr);//将包含网络字节序整型ip地址的in_addr对象转换成本地ch ...
- java网络编程基础——TCP网络编程一
基于TCP协议的网络编程 TCP/IP协议是一种可靠的网络协议,它的通信的两端各自建立一个Socket,从而在通信的两端之间形成网络虚拟链路. Java使用Socket对象来代表两端的通信端口,并通过 ...
- QT 网络编程一
QT如果要进行网络编程首先需要在.pro中添加如下代码:QT += network 在头文件中包含相关头文件 #include <QHostInfo> #include <QNetw ...
- Linux 网络编程一(TCP/IP协议)
以前我们讲过进程间通信,通过进程间通信可以实现同一台计算机上不同的进程之间通信. 通过网络编程可以实现在网络中的各个计算机之间的通信. 进程能够使用套接字实现和其他进程或者其他计算机通信. 同样的套接 ...
- Python学习笔记【第十三篇】:Python网络编程一Socket基础
什么是⽹络 网络能把双方或多方连在一起的工具,即把数据从一方传递到另一方进行数据传递. 网络编程就是不同电脑上的软件能够进行数据传递.即进程间的通讯. 什么是TCP/IP协议 协议就是大家一起遵守的约 ...
- Android初级教程理论知识(第八章网络编程一)
网络图片查看器 确定图片的网址 发送http请求 URL url = new URL(address); //获取连接对象,并没有建立连接 HttpURLConnection conn = (Http ...
- Java网络编程一:基础知识详解
网络基础知识 1.OSI分层模型和TCP/IP分层模型的对应关系 这里对于7层模型不展开来讲,只选择跟这次系列主题相关的知识点介绍. 2.七层模型与协议的对应关系 网络层 ------------ ...
- Linux网络编程一、tcp三次握手,四次挥手
一.TCP报文格式 (图片来源网络) SYN:请求建立连接标志位 ACK:应答标志位 FIN:断开连接标志位 二.三次握手,数据传输,四次挥手 (流程图,图片来源于网络) (tcp状态转换图,图片来源 ...
- Socket网络编程一
1.Socket参数介绍 A network socket is an endpoint of a connection across a computer network. Today, most ...
随机推荐
- Linux 忘记root密码 的解决办法
以单用户维护模式登录 先将系统重启, 在读秒时按下任意键进入菜单界面,再仔细看菜单下的说明,按下e就能进入grub的编辑模式,如下 将光标移动到kernel那行, 再次按e进入kernel的编辑界面中 ...
- iOS开发 - OC - duplicate symbol _OBJC / undefind symbol 错误的相关处理
前言: 作为一个iOS开发,相信大家都会遇到类似于 “duplicate symbol” 的程序报错. 对于很多新手来说,可能会有点手足无措,因为这种类型的报错一般并非是代码的逻辑错误,大部分情况下是 ...
- IO操作
/// <summary> /// 文件读写操作/// </summary> public partial class TestIO : DevComponents.DotNe ...
- nodejs + ionic2 + cordova环境搭建
1.nodejs 下载地址:https://nodejs.org/zh-cn/,执行默认安装就可以,可执行命令 node(环境变量) 2.修改 npm 源,执行:npm config set regi ...
- source tree 推送错误解决
fatal: The remote end hung up unexpectedly 出现这个问题是因为文件过大 解决办法: 打开git bash 输入git config --global http ...
- firebug常用工具
1.console.group("第一组"); console.log(1); console.groupend(); 2.console.dir(对象);//输出对象的所有信息 ...
- Linux系统安全保护措施
1.系统安全记录文件 操作系统内部的记录文件是检测是否有网络入侵的重要线索.如果系统是直接连接到Internet的,且发现有很多人对系统做telnet/FTP登录尝试,可以运行“#more/var/s ...
- symbol(s) not found for architecture x86_64 之 linker command failed with exit code 1 (use -v to see invocation)解决方案排查
这样的错误 ,我的解决方案是, 第一种: 查看他说在 ****.o 中,你要查看这样的关键点,然后去查看,你 项目中有没有引进这样的文件,在项目中查找,看项目中有没有,如果没有那就是没添加进来,你 ...
- css3动画2(transform用法)
1.直接写在样式里,比如一个小箭头,transform:rotate(135deg)即可 2.写动画过程,@keyframes和transform和animation组合起来用 写在@keyframe ...
- 嵌入式: jffs2,yaffs2,logfs,ubifs文件系统性能分析
在嵌入式领域,FLASH是一种常用的存储介质,由于其特殊的硬件结构,所以普通的文件系统如ext2,ext3等都不适合在其上使用,于是就出现了专门针对FLASH的文件系统,比较常用的有jffs2,yaf ...