C#多线程
一、创建线程
语法:
Thread thread = new Thread(方法名);
//第一步:创建一个线程 Thread thread = new Thread(Safe); // = true后台线程 = false前台线程,后台线程执行完会主动关闭 //前后台线程区别:前台线程不会死亡,除非绑定它的方法执行完成 //后台线程机制:当项目中所有前台线程死亡后,后台线程会突然销毁 thread.IsBackground = false; thread.Start();
线程池创建,推荐
//线程池创建线程 ThreadPool.QueueUserWorkItem(Out);
二、线程阻塞
//直到该线程完成后或经过了指定的时间为止执行 thread.Join(100); //线程睡眠指定时间,单位毫秒 Thread.Sleep(1000);
三、线程安全
object y2 = new object(); //锁的机制:线程会排队,当先进入线程执行完成,再执行其他线程。 lock (obj) { code... }
四、线程通信 signal
ManualResetEvent 和 AutoResetEvent
//一个或多个正在等待发生的线程事件 private ManualResetEvent manualResetEvent = new ManualResetEvent(true); //正在等待发生的线程事件 private AutoResetEvent autoResetEvent = new AutoResetEvent(true);
常用通信方法
//1.重置,将事件设置为非终止,导致线程阻塞。常用于初始化阻塞线程和暂停线程。 manualResetEvent.Reset(); //2.阻塞当前线程,直到接受到信号继续执行。常用于方法中等待信号 manualResetEvent.WaitOne(); //3.发送信号,将事件设置为有信号,允许一个或多个线程继续执行 manualResetEvent.Set();
五、处理当前任务的同时也兼顾其他任务
Application.DoEvents();
Application.DoEvents() 是一个在某些编程环境中使用的函数,它通常出现在如Visual Basic for Applications (VBA) 或其他基于消息循环的应用程序中。这个函数的作用是暂时放弃当前的执行流程,并允许其他事件(如用户点击或键盘输入)得到处理。
这可以防止在执行长时间运行的操作时,应用程序变得无响应。 在VBA中,比如你在Excel VBA宏中进行大量数据处理时,使用 Application.DoEvents 可以让Excel有机会刷新屏幕并处理任何等待的用户输入事件。这样可以提高用户体验,因为用户仍然可以与应用程序交互,即使有后台任务正在进行。
然而,需要注意的是过度使用 Application.DoEvents 可能会导致性能问题,因为每次调用都会打断程序执行流,所以应当谨慎使用
六、关闭退出当前程序
Environment.Exit(0); // 正常退出