C#多线程实例

xiaoxiao2021-02-28  152

(1)关于线程

线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。

如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。

(2)关于线程同步

C#线程同步可用lock(this){   //代码块  }

线程同步的真实意思和字面意思恰好相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。只能一个一个进入,异步是两个线程同时进入进行操作。

同步是牺牲了执行效率来换取数据的安全(完整性),异步操作执行效率才是最高的

(3)所以想提高效率,只有把一个任务分成多个任务,然后开多个线程分别去执行这几个任务 如果不分任务都去执行这个大任务,实际上是把这个大任务执行了多次(而且不同步的话数据可能出错)

以下为实例:

(sum=-500000000  计算-500000000累加到500000000需要5秒  分成两个任务开两个线程去执行时间减少一半)

private void thread_Click(object sender, EventArgs e) { long sum; Console.WriteLine("开始时间:"+ DateTime.Now); MyThread myThread1 = new MyThread(-500000000, 0); ThreadStart childref1 = new ThreadStart(myThread1.CallToChildThread); Thread childThread1 = new Thread(childref1); MyThread myThread2 = new MyThread(0, 500000000); ThreadStart childref2 = new ThreadStart(myThread2.CallToChildThread); Thread childThread2 = new Thread(childref2); childThread1.Name = "线程A"; childThread2.Name = "线程B"; childThread1.Start(); childThread2.Start(); childThread1.Join(); childThread2.Join();//Join方法主要是用来阻塞调用线程,直到某个线程终止或经过了指定时间为止 // 停止主线程一段时间 //Thread.Sleep(20000); // 现在中止子线程 // Console.WriteLine("In Main: Aborting the Child thread"); // childThread1.Abort(); //Console.ReadKey(); sum=myThread1.sum + myThread2.sum; } public class MyThread { private long i; public long sum=0; private int iCol; private int iRow; private long start; private long end; public MyThread(long start,long end) { this.start = start; this.end = end; } public void CallToChildThread() { for (i = start; i < end; i++) { //同步的话执行效率变慢 // Thread.Sleep(1); //加上sleep后才真正实现同步 //Console.WriteLine(Thread.CurrentThread.Name + i); sum += i; } Console.WriteLine(Thread.CurrentThread.Name +"结束"+DateTime.Now); Console.WriteLine(Thread.CurrentThread.Name + "结束"); } }

转载请注明原文地址: https://www.6miu.com/read-60912.html

最新回复(0)