C#多线程
记录一下初接触多线程学到的创建多线程,感觉有点像调用方法,但是不同的是可以同时进行不用排队了,可不是嘛,多线程的作用就是这样啊,哈哈哈哈哈,看看我找的代码
using System;
using System.Threading;
namespace MultithreadingApplication
{
class ThreadCreationProgram
{
static void Main(string[] args)
{
ThreadStart childref = new ThreadStart(CallToChildThread);
Console.WriteLine("Main:创建子线程");
Thread childThread = new Thread(childref);
childThread.Start();
// 停止主线程一段时间
Thread.Sleep(2000);
// 现在中止子线程
Console.WriteLine("Main:中止子线程");
childThread.Abort();
Console.ReadKey();
}
public static void CallToChildThread()
{
try
{
Console.WriteLine("子线程开始");
// 计数到 10
for (int counter = 0; counter <= 10; counter++)
{
Thread.Sleep(500);
Console.WriteLine(counter);
}
Console.WriteLine("子线程完成");
}
catch (ThreadAbortException e)
{
Console.WriteLine("线程中止异常");
}
finally
{
Console.WriteLine("无法捕获线程异常");
}
}
}
}
这串代码是在控制台写的,在这里
进去后有个默认的类,把里边的代码删掉粘贴上这段代码按F5就可以看到运行结果 ,我这里好像出了点错误,但是可以证明确实是多线程运行了
其中输出0、1、2都是子线程的方法,他们是在主线程休息那2秒钟的期间输出的,如果不理解可以这样改一下看看效果
这里就是关掉线程,把 CallToChildThread当做一个普通方法来调用,就不会存在在主线程休息的时候执行CallToChildThread()方法
CallToChildThread()方法会等主线程执行完毕之后,也就是输出“Main:中止子线程”之后再开始陆续输出0—10,执行结果是这样
现在明白了吧,没错我明白了哈哈哈
还有这个应该是线程被中止时可以捕获到吧,但是我不知道为什么没执行成功
关于ThreadStart和Thread的区别关系,可以看一下这段
//以下称为前者
ThreadStart childref = new ThreadStart(CallToChildThread);
Thread childThread = new Thread(childref);
//以下称为后者
Thread childThread = new Thread(CallToChildThread);
两者是没有任何区别的。
前者是c#的语法。后者是编译器帮改的;
.net中根本不支持 new Thread(childref); 这种代码是c#编译器支持的。
也就是说C#编译器把你写的不支持.net的东西(后者)编译成支持.net的(前者)然后再.net上运行。
在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,可以把ThreadStart理解为一个函数指针,指向线程要执行的函数
当调用C# Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。
ThreadStart是一个委托。虽然它叫Thread,但是它其实是一个普普通通的委托类型。
就好比
button1.Click += button1_Click;
和
button1.Click += new EventHandler(button1_Click);
发现一个大佬写的C#多线程,写的太好了可以去看看!
https://www.cnblogs.com/luxiaoxun/p/3280146.html