thread委托执行2个方法
C#多线程+委托+匿名方法+Lambda表达式

C#多线程+委托+匿名⽅法+Lambda表达式线程下⾯是百度写的:定义英⽂:Thread每个正在系统上运⾏的程序都是⼀个进程。
每个进程包含⼀到多个线程。
进程也可能是整个程序或者是部分程序的动态执⾏。
线程是⼀组指令的集合,或者是程序的特殊段,它可以在程序⾥独⽴执⾏。
也可以把它理解为代码运⾏的上下⽂。
所以线程基本上是轻量级的进程,它负责在单个程序⾥执⾏多任务。
通常由操作系统负责多个线程的调度和执⾏。
线程是程序中⼀个单⼀的顺序控制流程.在单个程序中同时运⾏多个线程完成不同的⼯作,称为多线程。
学习多线程之前,先复习⼀下什么叫委托。
delegate int calculator(int a, int b);//委托类型static void Main(string[] args){calculator Num = new calculator(add);Console.WriteLine(Num(1, 2));}private static int add(int a, int b){return a + b;}代码有点长,我们来想办法让代码短⼀点,巴啦啦能量,代码变短:delegate int calculator(int a, int b);//委托类型static void Main(string[] args){calculator Num = delegate (int a, int b){return a + b;};Console.WriteLine(Num(1, 2)); }变短了⼀⾏,这个就叫做。
那还能不能简短⼀点吗?delegate int calculator(int x, int y); //委托类型class Program3{static void Main(){calculator sum = (x, y) => x + y;//Lambda表达式Console.WriteLine(sum(1,2));}}代码是不是简洁了点了呢?好,接下来我们回到正题多线程编程,这⾥感谢⼀下给我写了⼀个多线程的Demo让我学习Thread theader = new Thread(new ThreadStart(new Action(() =>{Thread.Sleep(2000);Console.WriteLine("我是新建的⼦线程.....");})));theader.Start();Console.WriteLine("我是主线程......");Console.ReadKey();我们F12看下Thread有哪些⽤法,我们这⾥的案例使⽤了第⼀个⽅法然后再看看为什么可以直接new ThreadStart呢?原来它是⼀个委托⽅法。
Thread类常用方法

Thread类常⽤⽅法
Thread类常⽤⽅法
获取当前线程名称的⽅法:
第⼀种⽅法,在线程中使⽤getName()⽅法:
执⾏结果:
其中,根据多线程的内存原理,会开辟包含主线程的四个栈空间出来供cpu四个线程执⾏,优先级cpu⾃⼰选择,认为控制不了,所以可能会先执⾏Thread-2线程,后执⾏的Thread-1线程;
第⼆种获取线程名称的⽅法(使⽤Thread类的静态⽅法currentThread() ):
其中,主程序中打印的是当前主程序的线程名称,就是main;
设置线程的⽅法:
第⼀种设置线程名称的⽅式setName:
运⾏结果:
第⼆种设置线程名称的⽅法:通过⽗类带参数的构造⽅法:
运⾏结果:
Thread类的静态⽅法sleep():
运⾏结果:
每隔⼀秒遍历打印⼀些数组的元素;
其中,此睡眠是影响的当前正在执⾏的线程,即主线程main线程;
静态⽅法,直接类名点⽅法名调⽤;
sleep()⽅法是暂停固定毫秒数(1000ms = 1s)之后⾃动继续执⾏当前线程;。
新手学习C#委托、多线程过程

这是效果图。
delegate void daililist();//主线程之外的线程要调用main线程中建立的控件,需要使用委托
public void numadd() { Num ++; listBox1.Invoke(list1);//这是自己建立的线程要调用的方法,但是listbox1是main主线程建 立的控件,自定义的线程无法直接访问,上面已经定义了委托,此处应用listbox1的invoke //方法把所有对listbox1的操作都交给委托list1去处理。 //到此我们理一下思路,建立线程thread1、thread2,这两个线程都指向了numadd这个方法,首先都执行 Num++,然后执行listBox1.Invoke(list1),意思是说将要对listbox1操作, //但是具体操作在list1这个委托当中,然后这个委托指向了updatelist并执行,至此thread1、thread2 都完成了对listbox1的操作! } private void button2_Click(object sender, EventArgs e) { thread1.Abort(); thread1.Join(); thread2.Abort(); thread2.Join(); } } }
新手学习 C#委托、多线程的过程
由于我是刚刚学习 C#委托、多线程,看了几份资料,凭借自己的理解并自己动手编了个小 程序,希望能对大家的理解有所帮助。 背景: 什么是多线程?我们在建立以个 C#项目时,往往会在 Form1 上添加控件,然后写代码,初 学者都是在重复这个过程,其实这个过程是单线程的,可以理解为只有“main”主线程,有 的时候往往需要同时测量多个东西, 比如说在扫面局域网主机时, 如果按一个一个主机的 IP 去扫描,会很浪费时间,因为当一个主机未开机,会对这个主机等待一直到超时。如果建立 多个线程,让所有的 IP 扫描分配给不同的线程去执行,因此会节省很多时间,尤其是扫面 的 IP 段主机大部分没开机,和单线程比花费的时间差很多。
C#多线程系列之异步回调(委托)

C#多线程系列之异步回调(委托)本⽂参考⾃,纯属读书笔记在解析异步回调之前,先看同步回调的执⾏过程,以及代码原理。
1、线程的同步执⾏同步执⾏:在主线程执⾏的时候,主线程调⽤⼀个其它⽅法,此时主线程阻塞,等待调⽤⽅法执⾏完成后主线程才能继续执⾏。
代码如下:class Program{static void Main(string[] args){for (int i = 1; i < 11; i++) {if (i == 5) {Console.WriteLine("调⽤TakeAWhile⽅法并等待其执⾏完成");Console.WriteLine("开始执⾏TakeAWhile⽅法,时间:{0}", DateTime.Now);int result = TakeAWhile(0, 6000);if (result == 1) {Console.WriteLine("TakeAWhile⽅法执⾏完成");}Console.WriteLine("TakeAWhile⽅法执⾏完毕,时间:{0}", DateTime.Now);}Thread.Sleep(30);Console.WriteLine(i.ToString());}}static int TakeAWhile(int data, int time) {Thread.Sleep(time);return ++data;}}从上⾯的结果得出当程序开始调⽤TakeAWhile⽅法后,主线程阻塞,当TakeAWhile⽅法调⽤完毕之后,主线程⼜重新开始运⾏,这个过程就是线程的同步执⾏的过程.2、线程的异步执⾏what is 异步执⾏?异步执⾏:在主线程执⾏的时候,打开⼀个⼦线程,主线程不会像同步执⾏的那样等待⼦线程的结果返回后在执⾏,主线程会继续执⾏,当主线程需要⼦线程的运⾏结果时,主线程直接调⽤⼦线程的运⾏结果,如果⼦线程的运⾏结果还没有出来,那么主线程等待,直到⼦线程执⾏结束,主线程拿到⼦线程的运⾏结果,主线程在继续。
thread 调用异步方法

thread 调用异步方法在许多编程语言和框架中,使用线程(threads)来调用异步方法可以通过不同的方式实现,具体方法可能因编程语言和框架而异。
下面是一些常见的方法:1.使用线程池和异步任务:许多编程语言和框架提供了线程池和异步任务的机制,允许你提交异步任务给线程池执行。
例如,在Python 中,可以使用`concurrent.futures`模块的`ThreadPoolExecutor`来创建线程池,并提交异步任务。
import concurrent.futuresimport timedef async_function():time.sleep(3)return 'Async function executed'with concurrent.futures.ThreadPoolExecutor() as executor: future = executor.submit(async_function)result = future.result() # 阻塞,等待任务完成print(result)2.使用异步/await语法 (对应语言支持的情况下):许多现代编程语言(例如Python、JavaScript)提供了异步/await语法,允许以非阻塞的方式调用异步方法。
在Python中,可以使用`async`和`await`关键字来定义异步函数,并通过`await`关键字调用异步函数。
import asyncioasync def async_function():await asyncio.sleep(3)return 'Async function executed'async def main():result = await async_function()print(result)asyncio.run(main())3.使用回调函数:另一种常见的方式是使用回调函数。
C#中Thread(线程)和Task(任务)实例详解

C#中Thread(线程)和Task(任务)实例详解⽬录线程⼀,使⽤Thread类启动线程和数据传输⼆,线程池ThreadPool类任务⼀,创建并启动任务⼆,连续任务三,资源冲突问题总结线程线程:对于所有需要等待的操作,例如移动⽂件,数据库和⽹络访问都需要⼀定的时间,此时就可以启动⼀个新的线程,同时完成其他任务。
⼀个进程的多个线程可以同时运⾏在不同的CPU上或多核CPU的不同内核上。
⼀个应⽤程序启动时,会启动⼀个进程(应⽤程序的载体),然后进程会启动多个线程。
⼀,使⽤Thread类启动线程和数据传输使⽤Thread类可以创建和控制线程,Thread构造函数是⼀个⽆参⽆返回值的委托类型。
1 对Thread传⼊⼀个⽆参⽆返回类型的⽅法-ThreadStart。
public delegate void ThreadStart();实例:static void test(){Console.WriteLine("test is start");Console.WriteLine("test is running");Thread.Sleep(3000);Console.WriteLine("test is completed");}static void Main(string[] args){Thread th = new Thread(test);th.Start();Console.WriteLine("main is completed");}2 对Thread传⼊⼀个匿名⽅法(或lambda表达式)。
⽤于传⼊的⽅法代码简单的情况static void Main(string[] args){//lambad表达式Thread th = new Thread(()=> {Console.WriteLine("⼦线程1-ID:" + Thread.CurrentThread.ManagedThreadId);});th.Start();//匿名⽅法Thread th2 = new Thread(delegate (){Console.WriteLine("⼦线程2-ID:" + Thread.CurrentThread.ManagedThreadId);});th2.Start();Console.WriteLine("main is completed");}3 对Thread传⼊⼀个⽆返回值有参⽅法-ParameterizedThreadStart,该参数只能是object类型且只能有⼀个参数。
thread 写法

thread 写法一、基本概念Thread 是编程中的一个重要概念,指的是程序中的执行线程。
在多线程编程中,多个任务可以同时执行,从而提高程序的运行效率。
在 Java、C#、Python 等编程语言中,都有对线程的支持。
二、Thread 的创建创建 Thread 的方式因编程语言而异。
以 Java 和 C# 为例,介绍两种常见的创建方式。
1. Java 中创建 Thread 的方式:* 继承 Thread 类:需要重写 run() 方法,在该方法中编写线程要执行的代码。
* 实现 Runnable 接口:将实现该接口的对象作为参数传递给 Thread 对象,然后调用 Thread 对象的 start() 方法启动线程。
2. C# 中创建 Thread 的方式:* 使用 Thread 类:需要创建 Thread 对象,并调用其 Start() 方法启动线程。
在 Start() 方法内部,需要调用委托(Delegate)来指定线程要执行的代码。
无论是哪种方式,都需要在创建线程后调用 start() 方法启动线程,并在需要的时候调用 Thread 对象或委托的 Join() 方法等待线程执行完毕。
三、线程的同步和互斥在多线程编程中,为了保证数据的一致性和正确性,通常需要进行线程同步和互斥。
常见的同步机制包括锁(Lock)和信号量(Semaphore)等。
在使用这些机制时,需要注意避免死锁和竞态条件等问题。
四、线程的优先级和调度大多数编程语言都支持线程的优先级和调度。
通过设置线程的优先级,可以控制线程的执行顺序。
不同的编程语言有不同的调度机制,需要根据具体语言文档进行了解和设置。
五、常见问题及解决方案在多线程编程中,常见的问题包括竞态条件、死锁、线程泄露等。
针对这些问题,需要采取相应的解决方案,如使用锁的粒度控制、合理分配资源、避免长时间占用资源等。
六、线程的应用场景线程在多任务环境下具有很高的应用价值,可以大大提高程序的运行效率。
多线程(一):异步委托

多线程(一):异步委托下载多线程应用程序本身是相当不稳定的,虽然在.NET平台下,构建一个健壮的多线程程序的困难没有完全克服,但是这个复杂的过程还是被大大简化了。
使用System.Threading命名空间中定义的类型,能用最小的代价比较省心地创建额外的线程。
同样,当锁定共享数据时,可以使用多种类型,它们提供了诸如Win32 API线程源语一样的功能。
当然,System.Threading命名空间并不是构建多线程.NET程序的唯一办法。
委托同样能够异步调用成员。
开发者创建线程的原因大多数是为了让以无阻塞的(异步)方式调用方法。
虽然可以使用System.Threading命名空间达到类似的效果,但是委托可以使得整个过程大大简化。
委托public delegate int BinaryOp(int x, int y);声明一个委托后,作为响应,C#编译器将创建一个派生自System.MulticastDelegate的密封类型。
这些基类为每一个委托提供了维护方法地址列表的能力,这些方法可以再以后被调用。
上面那个例子的类差不多是这样:Code生成的Invoke()方法用来调用被代理对象用同步方式维护的方法。
因此,调用委托的线程(比如应用程序的主线程)将会一直等待,直到委托调用完成。
当然,Invoke()方法并不会直接在代码中被调用,而是在使用“正常的”调用语法时在幕后被触发的。
异步委托有些程序会操作比较长的时间,比如下载一个大文档,应用程序会挂起很长的时间。
直到任务完成以后,这个程序的其他部分才会有响应。
如何使委托在单独的线程上调用方法,以便模拟多个“同时”运行的任务?每一个.NET委托类型自动配备了这项能力,而且不需要深入研究System.Threandong命名空间的细节就能实现。
(值得注意的是:为了提高效率,使用BeginInvoke()的时候,CLR并不会创建新的线程,委托的BeginInvoke()方法创建了维护的工作线程池。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
thread委托执行2个方法
Thread类的构造函数接受两种委托方法。
ThreadStart–没有参数的方法。
ParameterizedThreadStart–接受带有对象类型参数的方法。
有两种类型的线程:
前台线程当线程的IsBackground属性设置为false(默认)时。
即使父前台线程被中止,前台线程也会继续执行。
背景线程当IsBackground正确设置为true时。当取消它的前台
线程被中止时,后台线程被中止。
您可以使用.Sleep()方法暂停线程的执行。它将放弃分配给线程
的时间片并将其交还给CPU。您还可以看到我使用了Join()方法。可
以在Parent线程中使用,等待线程完成工作并退出。请记住,在父
线程中调用Join将阻塞父线程的执行,直到子线程完成或退出。您
可以使用.Abort()方法中止线程的执行。
线程一退出通过参数传递的方法就停止执行。为了让线程永远继
续工作,您需要在执行方法中编写一个带有中断条件的循环。
除非您有需要更好地控制操作的特定用例,否则建议您使用
ThreadPool代替跨越线程。