LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

[点晴永久免费OA]C#多线程的启动与停止

admin
2022年11月25日 15:17 本文热度 1643
文章简介:线程在开发中作用很大,也经常用到,本文以Winfrom演示Redis队列的案例,来看一看线程的启动和停止,已经线程中操作winform的控件。

首先画个winform界面


先看代码

using System;
using System.Threading;
using System.Windows.Forms;
using EastWestWalk.NetFrameWork.Redis;
namespace Producer
{
    public partial class FrmMain : Form
    {
        private static string queueid = "MqId001";//队列id
        private static bool IsStrat = false;//是否继续生产信息
        private Thread StartThread = null;//生产线程
        private static bool IsEnd = false;//是否继续消费信息
        private Thread EndThread = null;//消费线程
        public FrmMain()
        {
            InitializeComponent();
        }
        /// <summary>
        ///开始生产按钮事件
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        private void btn_start_Click(object sender, EventArgs e)
        {
            if (btn_start.Text == "开始生产")
            {
                IsStrat = true;
                StartThread = new Thread(EnqueueRun);
                StartThread.Start();
                btn_start.Text = "正在生产";
            }
            else
            {
                IsStrat = false;
                Thread.Sleep(50);//这里很重要 不然线程任务还没结束 会报错
                if (StartThread != null && StartThread.ThreadState == ThreadState.Running)
                {
                    StartThread.Abort();
                    StartThread = null;
                }
                btn_start.Text = "开始生产";
            }
        }
        /// <summary>
        ///开始消费按钮事件
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        private void btn_end_Click(object sender, EventArgs e)
        {
            if (btn_end.Text == "开始消费")
            {
                IsEnd = true;
                EndThread = new Thread(DequeueRun);
                EndThread.Start();
                btn_end.Text = "正在消费";
            }
            else
            {
                IsEnd = false;
                Thread.Sleep(50);
                if (EndThread != null && EndThread.ThreadState == ThreadState.Running)
                {
                    EndThread.Abort();
                    EndThread = null;
                }
                btn_end.Text = "开始消费";
            }
        }
        /// <summary>
        /// 批量生产
        /// </summary>
        private void EnqueueRun()
        {
            using (var client = new DoRedisString(RedisUtility.RedisConfig))
            {
                int i = 0;
                while (IsStrat)
                {
                    string str = i + DateTime.Now.Ticks.ToString();
                    client.Core.EnqueueItemOnList(queueid, str);
                    txt_log.BeginInvoke(new Action(() =>
                    {
                        txt_log.AppendText($"生产:{str}\n");
                        txt_log.selectionStart = txt_log.TextLength;
                        txt_log.ScrollToCaret();
                    }));
                    i++;
                    Thread.Sleep(20);
                }
            }
        }
        /// <summary>
        ///批量消费
        /// </summary>
        private void DequeueRun()
        {
            using (var client = new DoRedisString(RedisUtility.RedisConfig))
            {
                while (IsEnd)
                {
                    if (client.Core.GetListCount(queueid) > 0)
                    {
                        string result = client.Core.DequeueItemfromList(queueid);
                        txt_log.BeginInvoke(new Action(() =>
                        {
                            txt_log.AppendText($"消费:{result}\n");
                            txt_log.selectionStart = txt_log.TextLength;
                            txt_log.ScrollToCaret();
                        }));
                        RedisUtility.SetRedis(result, $"消费成功:{result}", DateTime.Now.AddSeconds(30));
                        Thread.Sleep(20);
                    }
                    else
                    {
                        //如果当前队列为空,挂起1s
                        Thread.Sleep(1000);
                        client.Core.EnqueueItemOnList(queueid, "0");
                    }
                }
            }
        }
    }
}

两个线程,可以互不干扰的进行快速生产和消费,而且不会卡主线程

跨线程操作控件

                        txt_log.BeginInvoke(new Action(() =>
                        {
                            txt_log.AppendText($"消费:{result}\n");
                            txt_log.selectionStart = txt_log.TextLength;
                            txt_log.ScrollToCaret();
                        }));

该文章在 2022/11/25 15:18:02 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved