C#回调机制
来源:互联网 发布:apache storm 源码 编辑:程序博客网 时间:2024/05/17 20:09
在上述代码中有这样一条奇怪语句
CheckForIllegalCrossThreadCalls = false;//允许跨线程调用在.net上执行的是托管代码,C#强制要求这些代码必须是线程安全的,不允许跨线程访问windows窗体控件。儿这条语句是将C#内置控件(Control)类的CheckForIllegalCrossThreadCalls属性为false,以屏蔽C#编译器对跨线程调用的检查。这种做法是不安全的。如何在遵守.net安全标准前提下从一个线程访问另一个线程创建的控件,就要使用到C#回调机制。
定义、声明回调
private delegate void WriTextBox1Callback(char ch); private WriTextBox1Callback wriTextBox1Callback;//“回调”WriTextBox1Callback其实就是一个委托初始化回调方法
wriTextBox1Callback = new WriTextBox1Callback(WriText1);//其实就是实例化委托,这里的WriText1称为“回调方法”触发对象动作
textBox1.Invoke(wriTextBox1Callback,ch);//将委托wriTextBox1Callback作为参数传递给控件的Invoke方法采用回调、线程和委托机制实现“文字抄写员”
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 ThreadCallback{ public partial class Form1 : Form { //声明委托以实现回调机制 private delegate void WriteTextBox(char ch);//自定义委托 private WriteTextBox writeTextBox; //操作文本1的回调 private delegate void WriTextBox1Callback(char ch); private WriTextBox1Callback wriTextBox1Callback; //操作文本2的回调 private delegate void WriTextBox2Callback(char ch); private WriTextBox2Callback wriTextBox2Callback; public Form1() { InitializeComponent(); //CheckForIllegalCrossThreadCalls = false;//允许跨线程调用 wriTextBox1Callback = new WriTextBox1Callback(WriText1); wriTextBox2Callback = new WriTextBox2Callback(WriText2); } private void button1_Click(object sender, EventArgs e) { if (checkBox1.Checked == true) { textBox1.Clear(); textBox1.Refresh(); ThreadStart doTask1 = new ThreadStart(DoTask1); Thread tsk1Thread = new Thread(doTask1); tsk1Thread.Start(); } if (checkBox2.Checked == true) { textBox2.Clear(); textBox2.Refresh(); ThreadStart doTask2 = new ThreadStart(DoTask2); Thread tsk2Thread = new Thread(doTask2); tsk2Thread.Start(); } } private void DoTask1() { //使用回调 writeTextBox = new WriteTextBox(WriTextBox1); WriText(writeTextBox); } private void DoTask2() { //使用回调 writeTextBox = new WriteTextBox(WriTextBox2); WriText(writeTextBox); } private void WriText(WriteTextBox wMethod) { string str = textBox3.Text; for (int i = 0; i < str.Length; i++) { wMethod(str[i]); //延时 DateTime now = DateTime.Now; while (now.AddSeconds(1)>DateTime.Now){} } } private void WriTextBox1(char ch) { //使用回调语句 textBox1.Invoke(wriTextBox1Callback,ch); } private void WriTextBox2(char ch) { //使用回调语句 textBox2.Invoke(wriTextBox2Callback, ch); } private void WriText1(char ch) { textBox1.AppendText(ch + "\r"); } private void WriText2(char ch) { textBox2.AppendText(ch +"\r"); } }}
0 0
- C#回调机制
- C# 回调机制
- C# 回调机制
- C# 回调机制
- C#回调机制解析
- C#委托的回调机制
- C#委托的回调机制
- C#网络编程之回调机制实例(5)
- C#机制
- callback机制回调机制
- C#事件机制学习
- C#的事件机制
- C#的事件机制
- C#的多线程机制
- C#的继承机制
- C#事件处理机制
- C#的多线程机制
- C#的多线程机制
- USB HID Report Descriptor 报告描述符详解(节选自HID1.11协议)
- 什么是出色的员工
- Android开发历程_1(从1个activity跳转到另一个activity)
- /,/,//
- Android开发历程_2(实现简单的乘法计算)
- C#回调机制
- Boost.Regex库在linux上的编译安装,使用
- Android退出整个应用程序
- memcached真实项目中的应用
- UITableViewCell的简单应用-瀑布形相册
- 数据库-sqlserver-B库的B表同步到A库的A表
- 算法8-3:权重图接口
- log4j的MDC
- Win7下硬盘安装Ubuntu双系统(重新分区)