我很菜所以好好学!!!

    最近在做一个关于识别的项目,手动识别和自动识别,为了更好的保证自动识别不会引起界面的卡顿等现象,所以简单的学习了一下多线程,也只是入门但还是记录一下。

 

    一、首先了解一下用多线程的理由

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)
        {

        }
    }
}

 

版权声明:本文为xiaobaidashu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaobaidashu/p/9341229.html