上位机开发常用技术 C# Task 线程 开始,暂停,继续,停止

        上位机开发中一定会用到的技术就是 设备的线程开始运行执行生产流程,在生产过程中会有要打开安全门或暂停设备动作,人为去排除设备小问题的时就要用到暂停功能,问题排除后设备继续运行,生产完成后设备停止。 这些操作是上位机开发中必须要实现的功能。下面是一个简单的示例。

 1.界面

2.代码

2.1主要用到的对象

//线程源
private CancellationTokenSource cts = new CancellationTokenSource();
//手动停止事件对象
private ManualResetEvent resetEvent = new ManualResetEvent(true);
//线程
private Task task;

2.2 开始

/// <summary>
/// 开 始
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
    if (cts.IsCancellationRequested)
    {
        cts = new CancellationTokenSource();
    }
    resetEvent.Set();
    task = Task.Factory.StartNew(() =>
    {
        int count = 1;
        Color clrInfo = Color.Blue;
        while (!cts.IsCancellationRequested)
        {
            resetEvent.WaitOne();//阻止当前线程
            var strInfo = "运行日志[" + count + "]";
            AddListViewThread(null, strInfo, clrInfo);
            count++;
            Thread.Sleep(1000);
        }
    });
}

2.3 暂 停

/// <summary>
/// 暂 停
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPause_Click(object sender, EventArgs e)
{
    resetEvent.Reset();
}

2.4继 续

/// <summary>
/// 继 续
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnContinue_Click(object sender, EventArgs e)
{
    resetEvent.Set();
}

2.5停 止

/// <summary>
/// 停 止
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStop_Click(object sender, EventArgs e)
{
    cts.Cancel();
}

全部代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TaskWindowsFormsApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        delegate void AddListViewCallback(string strTime, string strContent, Color textColor);

        //线程源
        private CancellationTokenSource cts = new CancellationTokenSource();
        //手动停止事件对象
        private ManualResetEvent resetEvent = new ManualResetEvent(true);
        //线程
        private Task task;

        /// <summary>
        /// 开 始
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnStart_Click(object sender, EventArgs e)
        {
            if (cts.IsCancellationRequested)
            {
                cts = new CancellationTokenSource();
            }
            resetEvent.Set();
            task = Task.Factory.StartNew(() =>
            {
                int count = 1;
                Color clrInfo = Color.Blue;
                while (!cts.IsCancellationRequested)
                {
                    resetEvent.WaitOne();//阻止当前线程
                    var strInfo = "运行日志[" + count + "]";
                    AddListViewThread(null, strInfo, clrInfo);
                    count++;
                    Thread.Sleep(1000);
                }
            });
        }

        /// <summary>
        /// 暂 停
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPause_Click(object sender, EventArgs e)
        {
            resetEvent.Reset();
        }

        /// <summary>
        /// 继 续
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnContinue_Click(object sender, EventArgs e)
        {
            resetEvent.Set();
        }

        /// <summary>
        /// 显示(添加)日志
        /// </summary>
        /// <param name="strTime">时间</param>
        /// <param name="strContent">内裤</param>
        /// <param name="textColor">颜色</param>
        public void AddListViewThread(string strTime, string strContent, Color textColor)
        {
            if (this.IsDisposed)
            {
                return;
            }
            if (this.listViewWorkLogs.InvokeRequired)
            {//获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中
                AddListViewCallback d = new AddListViewCallback(AddListViewThread);
                this.Invoke(d, new object[] { strTime, strContent, textColor });
            }
            else
            {
                AddContent2ListView(strTime, strContent, textColor);
            }
        }

        /// <summary>
        /// 显示(添加)日志
        /// </summary>
        /// <param name="strTime">时间</param>
        /// <param name="strContent">内裤</param>
        /// <param name="textColor">颜色</param>
        public void AddContent2ListView(string strTime, string strContent, Color textColor)
        {
            try
            {
                if (strTime == null)
                {
                    strTime = string.Format("{0}:{1}:{2}", DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
                }

                int nCount = listViewWorkLogs.Items.Count;
                if (nCount > 600)
                {
                    for (int i = nCount - 1; i > 100; i--)
                    {
                        listViewWorkLogs.Items.RemoveAt(i);
                    }
                }
            }
            catch
            {
                int nCount = listViewWorkLogs.Items.Count;
                if (nCount > 600)
                {
                    listViewWorkLogs.Clear();
                }
            }
            ListViewItem lvItem = new ListViewItem();
            lvItem.ForeColor = textColor;
            lvItem.Text = strTime;
            lvItem.StateImageIndex = 0;
            lvItem.SubItems.Add(strContent);
            this.listViewWorkLogs.Items.Insert(0, lvItem);
        }

        /// <summary>
        /// 停 止
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnStop_Click(object sender, EventArgs e)
        {
            cts.Cancel();
        }
    }
}

上一篇:2024ideaUI切换和svn与git的切换,svn的安装和配置,idea集成svn ,2024-10-18日


下一篇:html中table和form的各个属性和使用