我很菜所以好好学!!!
最近在做一个关于识别的项目,手动识别和自动识别,为了更好的保证自动识别不会引起界面的卡顿等现象,所以简单的学习了一下多线程,也只是入门但还是记录一下。
一、首先了解一下用多线程的理由
1、可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。
2、可以使用线程来简化编码。
3、可以使用线程来实现并发执行。
大体可以分为以上三种,而我学习的目的则是为了实现并发执行。在实际运行多线程之前要了解多线程的一些基本函数,
- 创建线程 start();
- 中止线程 sleep();
- 线程等待 join();
- 终止线程 Abort();
- 确定线程的状态
- 线程优先级
- 前台线程和后台线程
- 向线程传递参数
- 使用C#的lock关键字锁定线程
- 使用Monitor锁定线程
- 处理异常
导入System.Threading命名空间,该命名空间包含了我们编写多线程程序所需要的所有类,然后调用上面的函数,其具体的教程网址(https://www.cnblogs.com/yonghuacui/p/6185610.html),讲解的非常细致,而想要真正的能够了解多线程还是要到实例中去了解,下面是一个关于C#winform多线程的一个小实例,看懂就学会了。
using System; using System.Windows.Forms; using System.Threading; namespace WinFormThread { public partial class frmMain : Form { public frmMain() { InitializeComponent(); } public delegate void ShowwaitDelegate(bool visible); public delegate void Calc(); public delegate void SetTxtControl(int i); private void button2_Click(object sender, EventArgs e) { Thread thread = new Thread(PostCalc); //创建一个多线程实例 thread.IsBackground = true; //前后台线程 thread.Start(); //线程开始 } private void PostCalc() { try { Showwait(true); //展示等待中字眼 ManualResetEvent[] _ManualEvents = new ManualResetEvent[2]; //阻塞线程专用 _ManualEvents[0] = new ManualResetEvent(false); ThreadPool.QueueUserWorkItem(new WaitCallback(calc1), _ManualEvents[0]); //将1放入线程池中 _ManualEvents[1] = new ManualResetEvent(false); ThreadPool.QueueUserWorkItem(new WaitCallback(calc2), _ManualEvents[1]); //将2放入线程池中 WaitHandle.WaitAll(_ManualEvents); Showwait(false); MessageBox.Show("执行完成", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch(Exception ex) { MessageBox.Show("PostCalc异常" + ex.ToString(),"提示信息", MessageBoxButtons.OK, MessageBoxIcon.Error); } } public void Showwait(bool visible) { if (labTest.InvokeRequired) { ShowwaitDelegate showwaitDelegate = new ShowwaitDelegate(Showwait); this.Invoke(showwaitDelegate, new object[] { visible }); } else { labTest.Visible = visible; labTest.Refresh(); } } public void calc1( object state) { int i = 0; while (i < 2000) { i++; setTextBox2(i); Thread.Sleep(1); } ManualResetEvent e = (ManualResetEvent)state; e.Set(); } public void calc2(object state) { int i = 0; while (i < 1000) { i++; setTextBox3(i); Thread.Sleep(1); } ManualResetEvent e = (ManualResetEvent)state; e.Reset(); // e.Set(); } public void setTextBox2(int i) { try { if (textBox2.InvokeRequired) { SetTxtControl setTxtControl = new SetTxtControl(setTextBox2); this.BeginInvoke(setTxtControl, new object[]{ i }); } else { textBox2.Text = i.ToString(); textBox2.Refresh(); } } catch(Exception ex) { MessageBox.Show(ex.ToString(), "setTextBox2异常"); } } public void setTextBox3(int i) { try { if (textBox3.InvokeRequired) { SetTxtControl setTxtControl = new SetTxtControl(setTextBox3); this.BeginInvoke(setTxtControl, new object[] { i }); } else { textBox3.Text = i.ToString(); textBox3.Refresh(); } } catch (Exception ex) { MessageBox.Show(ex.ToString(), "setTextBox3异常"); } } private void frmMain_Load(object sender, EventArgs e) { } } }