zoukankan      html  css  js  c++  java
  • c#winform多线程感想

        我很菜所以好好学!!!

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

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

    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)
            {
    
            }
        }
    }
  • 相关阅读:
    使用正则表达式验证邮箱格式
    写一个function,清除字符串前后的空格。(兼容所有浏览器)
    圣杯/双飞翼布局
    请指出document load和document ready的区别?
    Ajax的优缺点及工作原理?
    Web Storage与Cookie相比存在的优势:
    sessionStorage 、localStorage 和 cookie 之间的区别
    什么叫优雅降级和渐进增强?
    浏览器的内核分别是什么?
    [翻译] MSAlertController
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/9341229.html
Copyright © 2011-2022 走看看