C#多线程基础文档格式.docx
- 文档编号:17864039
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:8
- 大小:17.66KB
C#多线程基础文档格式.docx
《C#多线程基础文档格式.docx》由会员分享,可在线阅读,更多相关《C#多线程基础文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
,label1果然显示了100;
代码如下:
(例1)
usingSystem;
usingSystem.Windows.Forms;
namespaceThreadTest
{
publicpartialclassForm1:
Form
{
publicForm1()
InitializeComponent();
}
privatevoidForm1_Load(objectsender,EventArgse)
label1.Text="
}
很简单吧,看懂了吗?
什么,没有,啊~~~神啊~~~救救我吧,那请你在翻书,把最最最最最基础的书翻出来看看里面的最最最最最简单例子(以后不要说我认识你)
好了,看懂的朋友继续往下看:
我们现在要将程序稍稍改动一下,添加一个Button,命名为button1,我们要在按下button1后,将lable1的text从0显示到100,
那么,我们需要添加button1的Click事件,在click事件内写入循环显示0到100.
(例2)
0"
privatevoidbutton1_Click(objectsender,EventArgse)
for(inti=0;
i<
101;
i++)
label1.Text=i.ToString();
运行一下看看,按一下button1,结果是我们一下就看到了100,并没有看到0~100的过程,为什么呢?
呵呵,因为你的处理器速度太快了,就只能看到最后的结果,那么,怎样才能看到中间过程呢?
(等一下再讲)
我们先用函数的方式来实现上面的功能
写个名为run的函数吧:
privatevoidrun()
这样就可以直接调用run函数实现功能了,而不用在事件函数内写代码。
(这样做是有好处的)
整个代码如下:
(例3)
run();
//调用run函数
privatevoidrun()
这里就需要在循环过程中加延时了,假定我们每隔1s的延时,lable1的值增加1。
方法有很多,我们就用一个timer来实现延时。
添加一个timer,命名为timer1,在timer1的tick事件内添加语句,改变label1的值。
(Tick事件是每经过指定时间间隔后被触发)
(例4)
inti;
//全局变量i
i=0;
timer1.Interval=1000;
//设置timer1的间隔时间
timer1.Start();
//启动timer1
privatevoidtimer1_Tick(objectsender,EventArgse)//timer1的Tick事件
i++;
if(i>
100)
timer1.Stop();
同样的,我们运行一下,看看结果,很好,我们能够看到0~100循环的过程了。
下面我们就要进入多线程了,不知道各位将上面的内容看懂了没有?
开始进入多线程之前我还是先简单的说说定义线程吧。
(与多线程有关的其它内容我就不说了吧,那个太多太多了)
由于要使用多线程,我们需要引用System.Threading;
所以之后的代码都会在前面加上usingSystem.Threading;
怎么定义线程呢?
通过下面的语句就定义一个名为thread1的线程
privateThreadthread1;
和定义函数极为相似
定义线程之后,就要进行实例化:
thread1=newThread(newThreadStart(run));
这个语句的意思就是实例化thread1并将run函数设定为thread1的入口函数(大概意思就是,让run函数在线程thread1上执行,我是这样理解的)
创建线程就算完成了,那么怎么运行线程呢?
其实和启动timer1是类似的,thread1.Start();
就运行了我们创建的线程thread1。
好了,大功告成!
哈哈,别着急,既然我们创建了线程,那么在关闭窗口的时候,就要撤消线程。
添加FormClosing事件,在事件内部写如撤消线程的代码:
privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse)
if(thread1.IsAlive)//判断thread1是否存在,不能撤消一个不存在的线程,否则会引发异常
thread1.Abort();
//撤消thread1
这样才算大功告成嘛,整理的代码如下:
(例5)(在例3的基础上加以改动)
usingSystem.Threading;
privateThreadthread1;
thread1=newThread(newThreadStart(run));
thread1.Start();
for(inti=0;
i<
101;
i++)
privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse)
if(thread1.IsAlive)
运行看看,按button1,出错了,怎么回事呢?
?
哈哈~~看看出错原因,是在run函数内的label1.Text=i.ToString();
语句上出的错,没错啊,语法正确啊
哈哈~~我来解释一下,出错的原因是为了保护数据的安全所以不能跨线程调用控件,而label1.Text=i.ToString();
句则是在线程thread1上面调用主线程的控件,肯定会出错的
!
怎么办呢?
用委托啊(有关委托,请参考其它资料,我就不多说了)
我的理解就是,线程thread1不能调用主线程的lable1,所以,就委托主线程来改变lable1的值。
首先看一个例子:
(从例3改写)(并不创建线程,仅有主线程)
创建一个函数,用来设置lable1的值;
privatevoidset_lableText(strings)
label1.Text=s;
当需要改变lable1的值时,就调用它,并传递要改变的值。
整理代码如下:
(例6)
set_lableText(i.ToString());
privatevoidset_lableText(strings)
实现的功能与例3是一样的,只是,增加了一个函数。
现在再来看看委托,我们就需要委托主线程调用函数set_lableText(strings);
来改变lable1的值。
首先声明一个委托:
delegatevoidset_Text(strings);
创建一个全局委托变量:
(应该是变量吧)
set_TextSet_Text;
//请注意大小写,set_Text是委托类型,Set_Text是创建的委托(当然,这里的命名是随意的)
类似于创建线程,需要进行实例化:
Set_Text=newset_Text(set_lableText);
//括号内的set_lableText是委托要调用的函数(也就是例6写的set_lableText(strings);
函数)
现在,就剩下调用委托了,怎么调用委托呢?
很简单。
同过Invoke来调用,语句如下:
label1.Invoke(Set_Text,newobject[]{i.ToString()});
//Set_Text是调用的委托,object[]则是我们要传递的参数
(例7)
//定义线程
delegatevoidset_Text(strings);
//定义委托
set_TextSet_Text;
Set_Text=newset_Text(set_lableText);
//实例化
privatevoidset_lableText(strings)//主线程调用的函数
label1.Invoke(Set_Text,newobject[]{i.ToString()});
//通过调用委托,来改变lable1的值
Thread.Sleep(1000);
//线程休眠时间,单位是ms
这样,一个简单的多线程程序就算完成了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 多线程 基础
![提示](https://static.bdocx.com/images/bang_tan.gif)