c#使用ThreadPool

        说到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效果

来源:c#使用ThreadPool_c# threadpool_故里2130的博客-CSDN博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用C#编写的线程池类代码示例: ```csharp using System; using System.Threading; namespace ThreadPoolExample { class Program { static void Main(string[] args) { // 创建线程池对象 ThreadPoolExample threadPoolExample = new ThreadPoolExample(); // 启动线程池 threadPoolExample.Start(); Console.ReadKey(); } } public class ThreadPoolExample { private int _numberOfThreads = 4; // 线程池中的线程数 private int _taskCount = 10; // 要执行的任务数 public void Start() { // 创建线程池 ThreadPool.SetMaxThreads(_numberOfThreads, _numberOfThreads); ThreadPool.SetMinThreads(2, 2); // 创建任务 for (int i = 0; i < _taskCount; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(ExecuteTask), i); } } private void ExecuteTask(object task) { // 模拟任务执行 Console.WriteLine($"Task {task} is executing on thread {Thread.CurrentThread.ManagedThreadId}"); Thread.Sleep(1000); Console.WriteLine($"Task {task} execution completed on thread {Thread.CurrentThread.ManagedThreadId}"); } } } ``` 在上面的示例中,我们创建了一个 `ThreadPoolExample` 类,其中包括一个 `Start()` 方法,该方法使用 `ThreadPool` 类来启动线程池并执行任务。 我们在 `Start()` 方法中设置了线程池的最大和最小线程数。然后我们创建了 `_taskCount` 个任务,并将它们添加到线程池中。每个任务都是通过调用 `ThreadPool.QueueUserWorkItem()` 方法来添加的。该方法需要一个 `WaitCallback` 委托,该委托指向要执行的方法。在这里,我们将 `ExecuteTask()` 方法作为要执行的方法。 `ExecuteTask()` 方法是模拟要执行的任务。我们将每个任务的执行延迟 1 秒钟,并在控制台中打印出任务执行的线程 ID。 最后,我们在 `Main()` 方法中实例化了 `ThreadPoolExample` 类并调用了 `Start()` 方法来启动线程池。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故里2130

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值