C#多线程基础实例

上传人:ji****72 文档编号:37536739 上传时间:2018-04-18 格式:DOC 页数:11 大小:57KB
返回 下载 相关 举报
C#多线程基础实例_第1页
第1页 / 共11页
C#多线程基础实例_第2页
第2页 / 共11页
C#多线程基础实例_第3页
第3页 / 共11页
C#多线程基础实例_第4页
第4页 / 共11页
C#多线程基础实例_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《C#多线程基础实例》由会员分享,可在线阅读,更多相关《C#多线程基础实例(11页珍藏版)》请在金锄头文库上搜索。

1、C#C#多线程基础实例多线程基础实例 分类:.NET 开发C#语言首先我要提一点,关于线程的基础知识,一个程序,即一个进程,可以有很多个线程,当然,至少要有一个线程,即主线程.相信大家都知道多线程的好处吧,举个书上的例子 吧,Windows 在复制文件的时候,有个动画,是在复制文件过程中进行的,也就是一边复制文件,一边播放动画,这个就是很简单的多线程,如果没有动画,复制一个大文件的时候,我们知 道计算机是死机了,还是仍然在复制呢?多线程就很好的解决了这个问题.懂了吧,恩,很好!那么,我们就开始吧! 首先,我们写个简单的单线程程序,也就是只有程序自己创建的那个主线程,没有使用多线程. 创建一个新

2、工程,向窗口添加一个 label 命名为 label1;我们要让程序运行时 label1 就显示一个数字,假设为 100;通常我们会直接在窗口加载事件中写 label1.Text = “100“;这样,运行 ,label1 果然显示了 100; 代码如下:(例 1) usingusing System;System;usingusing System.Windows.Forms;System.Windows.Forms; namespacenamespace ThreadTestThreadTest publicpublic partialpartial classclass Form1For

3、m1 : : FormForm publicpublic Form1()Form1() InitializeComponent();InitializeComponent(); privateprivate voidvoid Form1_Load(Form1_Load(objectobject sender,sender, EventArgsEventArgs e)e) label1.Textlabel1.Text = = “100“;“100“; 很简单吧,看懂了吗? 什么,没有,啊神啊救救我吧,那请你在翻书,把最最最最最基础的书翻出来看看里面的最最最最最简单例子(以后不要说我认识你) 好了

4、,看懂的朋友继续往下看: 我们现在要将程序稍稍改动一下,添加一个 Button,命名为 button1,我们要在按下button1 后,将 lable1 的 text 从 0 显示到 100,那么,我们需要添加 button1 的 Click 事件,在 click 事件内写入循环显示 0 到 100. 代码如下:(例 2) usingusing System;System;usingusing System.Windows.Forms;System.Windows.Forms; namespacenamespace ThreadTestThreadTest publicpublic parti

5、alpartial classclass Form1Form1 : : FormForm publicpublic Form1()Form1() InitializeComponent();InitializeComponent(); privateprivate voidvoid Form1_Load(Form1_Load(objectobject sender,sender, EventArgsEventArgs e)e) label1.Textlabel1.Text = = “0“;“0“; privateprivate voidvoid button1_Click(button1_Cl

6、ick(objectobject sender,sender, EventArgsEventArgs e)e) forfor( (intint i=0;i 100)100) timer1.Stop();timer1.Stop(); label1.Textlabel1.Text = = i.ToString();i.ToString(); 同样的,我们运行一下,看看结果,很好,我们能够看到 0100 循环的过程了。 下面我们就要进入多线程了,不知道各位将上面的内容看懂了没有? 开始进入多线程之前我还是先简单的说说定义线程吧。(与多线程有关的其它内容我就不说了吧,那个太多太多了)由于要使用多线程,

7、我们需要引用 System.Threading;所以之后的代码都会在前面加上using System.Threading;System.Threading;怎么定义线程呢?通过下面的语句就定义一个名为 thread1 的线程privateprivate ThreadThread thread1;thread1;和定义函数极为相似定义线程之后,就要进行实例化:thread1thread1 = = newnew ThreadThread( (newnew ThreadStartThreadStart(run);(run);这个语句的意思就是实例化 thread1 并将 run 函数设定为 thre

8、ad1 的入口函数(大概意思就是,让 run 函数在线程 thread1 上执行,我是这样理解的) 创建线程就算完成了,那么怎么运行线程呢?其实和启动 timer1 是类似的,thread1.Start();就运行了我们创建的线程 thread1。 好了,大功告成!哈哈,别着急,既然我们创建了线程,那么在关闭窗口的时候,就要撤消线程。添加 FormClosing 事件,在事件内部写如撤消线程的代码: privateprivate voidvoid Form1_FormClosing(Form1_FormClosing(objectobject sender,sender, FormClosin

9、gEventArgsFormClosingEventArgs e)e) ifif (thread1.IsAlive)(thread1.IsAlive) /判断判断 thread1thread1 是否存在,不能撤消一个不存在的线程,否则是否存在,不能撤消一个不存在的线程,否则会引发异常会引发异常 thread1.Abort();thread1.Abort(); /撤消撤消 thread1thread1 这样才算大功告成嘛,整理的代码如下:(例 5)(在例 3 的基础上加以改动) usingusing System;System;usingusing System.Threading;System

10、.Threading;usingusing System.Windows.Forms;System.Windows.Forms; namespacenamespace ThreadTestThreadTest publicpublic partialpartial classclass Form1Form1 : : FormForm privateprivate ThreadThread thread1;thread1; publicpublic Form1()Form1() InitializeComponent();InitializeComponent(); privateprivate

11、 voidvoid Form1_Load(Form1_Load(objectobject sender,sender, EventArgsEventArgs e)e) label1.Textlabel1.Text = = “0“;“0“; privateprivate voidvoid button1_Click(button1_Click(objectobject sender,sender, EventArgsEventArgs e)e) thread1thread1 = = newnew ThreadThread( (newnew ThreadStartThreadStart(run);

12、(run);thread1.Start();thread1.Start(); privateprivate voidvoid run()run() forfor ( (intint i i = = 0;0; i i 101;101; i+)i+) label1.Textlabel1.Text = = i.ToString();i.ToString(); privateprivate voidvoid Form1_FormClosing(Form1_FormClosing(objectobject sender,sender, FormClosingEventArgsFormClosingEve

13、ntArgs e)e) ifif (thread1.IsAlive)(thread1.IsAlive) thread1.Abort();thread1.Abort(); 运行看看,按 button1,出错了,怎么回事呢?哈哈看看出错原因,是在 run 函数内的 label1.Text = i.ToString();语句上出的错,没错啊,语法正确啊 哈哈我来解释一下,出错的原因是为了保护数据的安全所以不能跨线程调用控件,而label1.Text = i.ToString();句则是在线程 thread1 上面调用主线程的控件,肯定会出错的 !怎么办呢?用委托啊(有关委托,请参考其它资料,我就不多

14、说了)我的理解就是,线程 thread1 不能调用主线程的 lable1,所以,就委托主线程来改变lable1 的值。 首先看一个例子:(从例 3 改写)(并不创建线程,仅有主线程)创建一个函数,用来设置 lable1 的值; privateprivate voidvoid set_lableText(set_lableText(stringstring s)s) label1.Textlabel1.Text = = s;s; 当需要改变 lable1 的值时,就调用它,并传递要改变的值。 整理代码如下:(例 6) usingusing System;System;usingusing Sys

15、tem.Windows.Forms;System.Windows.Forms; namespacenamespace ThreadTestThreadTest publicpublic partialpartial classclass Form1Form1 : : FormForm publicpublic Form1()Form1() InitializeComponent();InitializeComponent(); privateprivate voidvoid Form1_Load(Form1_Load(objectobject sender,sender, EventArgsEventArgs e)e) label1.Textlabel1.Text = = “0“;“0“; privateprivate voidvoid button1_Click(button1_Click(objectobject sender,sender, EventArgsEventArgs e)e) run();run(); /调用调用 runrun 函数函数 privatepriva

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号