欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Winform c# 多线程处理实例

程序员文章站 2022-07-05 10:50:09
我们在用C# 开发程序时,经常会使用的多线程,实现多任务的处理。一般常用的方法是新建多个线程,进行处理。 今天我分享一个采用线程池的方式来实现的实例。对有需要的朋友做个借鉴。 实例: Winform using System; using System.Collections.Generic; us ......

   我们在用c# 开发程序时,经常会使用的多线程,实现多任务的处理。一般常用的方法是新建多个线程,进行处理。

   今天我分享一个采用线程池的方式来实现的实例。对有需要的朋友做个借鉴。

   实例: winform

  

using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.text;
using system.windows.forms;
using system.threading;

namespace multithreading
{
    /// <summary>
    /// 此实例:为sdp软件快速开发平台中使用到的真实方法
    /// </summary>
    public partial class form1 : form
    {
        /// <summary>
        /// 私有:线程同步信号
        /// </summary>
        private manualresetevent cmdwaiter;

        /// <summary>
        /// 委托更新进度条
        /// </summary>
        private delegate void updatebar();

        /// <summary>
        /// 结束提示委托
        /// </summary>
        private delegate void showend();

        /// <summary>
        /// 任务队列
        /// 注意:此任务队列 需要用户自动来定义 
        /// 实例中采用 string 来处理
        /// </summary>
        private list<string> tasklist = new list<string>();

        /// <summary>
        /// 构造函数
        /// </summary>
        public form1()
        {
            initializecomponent();
        }

        /// <summary>
        /// 页面初始化加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void form1_load(object sender, eventargs e)
        {

            // 阻塞当前线程
            cmdwaiter = new manualresetevent(false);

            // 启动线程池
            threadpool.queueuserworkitem(new waitcallback(this.on_threadevent));

        }

        /// <summary>
        /// 线程处理事务
        /// </summary>
        /// <param name="obj"></param>
        private void on_threadevent(object obj)
        {
            while (true)
            {
                try
                {
                    // 阻塞当前线程,等待解除指令
                    this.cmdwaiter.waitone();

                    // 执行我们需要处理的事务
                    for (int k = 0; k < tasklist.count; k++)
                    {
                        run_mybusiness(tasklist[k]);

                        // 休息指定的毫秒
                        thread.sleep(50);
                    }


                    // 清除队列数据
                    this.tasklist.clear();

                    this.on_endlog();
                    this.cmdwaiter.reset();
                }
                catch (exception e)
                {
                    string strerror = e.message.tostring();
                    this.tasklist.clear();
                    this.cmdwaiter.reset();
                }
            }
        }

        /// <summary>
        /// 执行我们自己的业务
        /// </summary>
        /// <param name="str"></param>
        private void run_mybusiness(string str)
        {
            // 委托更新
            updatebar updatedelegate = new updatebar(on_update);
            this.invoke(updatedelegate);
        }

        /// <summary>
        /// 开始按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_start_click(object sender, eventargs e)
        {

            this.tasklist = new list<string>();
            for (int i = 1; i < 1001; i++)
            {
                this.tasklist.add(i.tostring());
            }


            this.txt_log.text = "开始:" + datetime.now.tostring("yyyy-mm-dd hh:mm:ss") + environment.newline;


            this.pg_bar.value = 0;
            this.pg_bar.maximum = this.tasklist.count;

            // 解除阻塞
            this.cmdwaiter.set();
        }

        /// <summary>
        /// 更新进度条
        /// </summary>
        private void on_update()
        {
            this.pg_bar.value = this.pg_bar.value + 1;
        }


        private void on_endlog()
        {
            showend enddeg = new showend(on_updatetextbox);
            this.invoke(enddeg);
        }

        private void on_updatetextbox()
        {
            string runstr = "结束:" + datetime.now.tostring("yyyy-mm-dd hh:mm:ss");
            this.txt_log.text = this.txt_log.text + runstr;
        }
    }
}

 

 运行效果:

Winform c# 多线程处理实例

 

下载地址:多线程实例 demo