说到ThreadPool,都知道是线程池。在c#中,有很多方式可以实现线程。从时间上来排序,大概是这样的,Thread,backgroundworker,ThreadPool,Parallel,Task。其中后面2种是最新的,之前的很少使用,如果是老项目,基本上前面用的多,而新项目,最好使用后面的2种,因为后面的效率以及各方面控制更加的容易上手,需要开发者考虑的问题,也更加的少,使用起来简单方便。
程序中使用线程,可以帮助程序更加快速的处理计算问题,但是不是线程越多就越好,new线程同样也会消耗掉资源。
下面示例使用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.效果
拓展
1.其中WaitCallback是一个带有参数的方法,所以上面案例,需要传递一个object对象,可见,属于多次一举,但是规定就是这样的。
public static bool QueueUserWorkItem(WaitCallback callBack)
public delegate void WaitCallback(object state);
2.如果调用的方法,需要传递参数,那么使用下面的方式
public static bool QueueUserWorkItem(WaitCallback callBack, object state)
此时a的变量就是666。
3.如果把上面的逻辑修改一下,先让加法运行,后让减法运行,那么需要使用信号量去控制。
3.1界面如下
运行后,点击开始
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效果
文章来源:https://www.toymoban.com/news/detail-572522.html
来源:c#使用ThreadPool_c# threadpool_故里2130的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-572522.html
到了这里,关于c#使用ThreadPool的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!