c#使用ThreadPool

        说到ThreadPool,都知道是线程池。在c#中,有很多方式可以实现线程。从时间上来排序,大概是这样的,Thread,backgroundworker,ThreadPool,Parallel,Task。其中后面2种是最新的,之前的很少使用,如果是老项目,基本上前面用的多,而新项目,最好使用后面的2种,因为后面的效率以及各方面控制更加的容易上手,需要开发者考虑的问题,也更加的少,使用起来简单方便。

        程序中使用线程,可以帮助程序更加快速的处理计算问题,但是不是线程越多就越好,new线程同样也会消耗掉资源。

下面示例使用ThreadPool。

1.业务是,启动程序后,一个进行加法运算,一个进行减法运算,并且界面可以移动。

c#使用ThreadPool_第1张图片

2.代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;  //加上后,可以不需要使用Invoke
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem(A);
            ThreadPool.QueueUserWorkItem(B);
        }

        private void A(object a)
        {
            for (int i = 0; i < 20; i++)
            {
                Thread.Sleep(1000);
                label1.Text = i.ToString();
                //Invoke(new Action(() => label1.Text = i.ToString()));
            }

        }

        private void B(object b)
        {
            for (int i = 0; i < Convert.ToInt16(label2.Text); i++)  //界面的值设置100
            {
                Thread.Sleep(1000);
                label2.Text = (Convert.ToInt16(label2.Text) - 1).ToString();
                //Invoke(new Action(() => label2.Text = (Convert.ToInt16(label2.Text) - 1).ToString()));
            }

        }
    }
}

3.效果

 c#使用ThreadPool_第2张图片

拓展

1.其中WaitCallback是一个带有参数的方法,所以上面案例,需要传递一个object对象,可见,属于多次一举,但是规定就是这样的。 

   public static bool QueueUserWorkItem(WaitCallback callBack)
   public delegate void WaitCallback(object state);

2.如果调用的方法,需要传递参数,那么使用下面的方式

public static bool QueueUserWorkItem(WaitCallback callBack, object state)

c#使用ThreadPool_第3张图片 

此时a的变量就是666。 

3.如果把上面的逻辑修改一下,先让加法运行,后让减法运行,那么需要使用信号量去控制。

3.1界面如下

运行后,点击开始

c#使用ThreadPool_第4张图片 

3.2代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        ManualResetEvent manual = new ManualResetEvent(false);
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;  //加上后,可以不需要使用Invoke
        }

        private void Form1_Load(object sender, EventArgs e)
        {


        }

        private void A(object a)
        {
            for (int i = 0; i < 20; i++)
            {
                Thread.Sleep(1000);
                label1.Text = i.ToString();
                //Invoke(new Action(() => label1.Text = i.ToString()));
            }
            manual.Set();    //执行A
        }

        private void B(object b)
        {
            for (int i = 0; i < Convert.ToInt16(label2.Text); i++)  //界面的值设置100
            {
                Thread.Sleep(1000);
                label2.Text = (Convert.ToInt16(label2.Text) - 1).ToString();
                //Invoke(new Action(() => label2.Text = (Convert.ToInt16(label2.Text) - 1).ToString()));
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem(A);
            manual.WaitOne();//等待A执行完毕
            ThreadPool.QueueUserWorkItem(B);
        }
    }
}

3.2效果

c#使用ThreadPool_第5张图片 

 

你可能感兴趣的:(#,基础知识,.net)