狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

[點晴永久免費OA]C#多線程的啟動與停止

admin
2022年11月25日 15:17 本文熱度 1847
文章簡介:線程在開發中作用很大,也經常用到,本文以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-2025 ClickSun All Rights Reserved