c#语法:多线程编程(thread) -ag凯发k8国际
操作系统为了提高效率将一个进程分成多个线程。有一个主线程其他的都为子线程,在认识多线程前,我们的代码都是在主线程中执行的。都有一个规则就是 必须执行当前代码才会执行之后的代码。那么问题就来了,假如说有一个非常耗时的操作,比如加载数据或文件下载,难不成数据加载完之前,之后的代码以及其他代码都不执行吗?我们用过不少软件,比如迅雷、百度云,在下载文件的时候还可以进行其他操作,程序不会因为当前任务没执行完而停止。这就运用到了线程。如果将一个耗时10秒的操作放到主线程中,当程序执行到这段代码的时候就会卡机,也就是程序未响应。一种方法是用户等待10秒后让程序执行完,但大多数用户会选择后者:关闭程序。
一、thread 类:(system.threading.thread)
表示托管线程,运行在.net平台之上的,每一个thread对象代表一个线程,多线程开发就有多个thread对象。每一个线程都对应着一个任务(方法)。
二、示例代码;该窗体有3个控件一个label,两个button
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 csharp窗体练习 {public partial class form1 : form{ public form1(){initializecomponent();}private void form1_load(object sender, eventargs e){}private int count = 0;private void btncounter_click(object sender, eventargs e){thread objthread = new thread(delegate() {for (int i = 0; i < 5; i ){thread.sleep(1000);if (label1.invokerequired){label1.invoke(new action((s,num) => { label1.text = s num; }) , count.tostring(),i);}}});objthread.isbackground = true;objthread.start();count ;}private void btnclear_click(object sender, eventargs e){count=0;}} }首先第一步是创建thread 对象: thread objthread=new thread(<参数>);thread构造方法中有参数,可以选中thread按f1查看帮助文档.翻开这些参数的定义:
public delegate void parameterizedthreadstart(object obj )parameterizedthreadstart其实就是一个无返回值带参数的一个委托。
public delegate void threadstart()当然这就是一个无参数的委托。总结起来就是thread构造方法里要放一个委托...所以上述使用了匿名方法当然也可以使用lambda表达式在匿名方法里写要操作的内容。
之后别忘了把线程isbackground 属性设为true,默认为前台线程,设为true时为后台线程。前台线程与后台线程的区别是,应用程序必须在所有前台线程完成后才关闭,而后台线程,应用程序可以不考虑后台线程是否执行完,应用程序关闭后台线程自动关闭。如果你关闭了某个应用程序,但是在进程中发现该应用程序还在运行,说明该程序的前台进程还在运行。要么是编程的时候不注意,也有可能是流氓软件。
最后把线程start就可以了。
但是,在子线程中无法直接访问主线程的可视化控件,主线程和子线程就像各部门一样,做自己的事情,但是想随意访问内部消息是不允许的。虽然不能直接访问但是能间接访问呐,便可以使用invoke()方法来实现。 invoke(
invoke方法第一个参数我用了action。action和func都内置了委托,action为无返回值的匿名方法,而func有返回值 func<参数1,参数2...,参数n,返回值>,除最后一个是返回值,之前的都是要传给方法的参数.
总结
以上是ag凯发k8国际为你收集整理的c#语法:多线程编程(thread)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: c#语法:委托与事件
- 下一篇: visual stuidio 快捷键的修