当前位置: 首页 > article >正文

上位机开发常用技术 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();
        }
    }
}


http://www.kler.cn/news/358648.html

相关文章:

  • Flutter Container组件
  • Javascript 脚本查找B站限时免费番剧
  • 对“一个中心,三重防护”中安全管理中心的理解
  • jmeter 从多个固定字符串中随机取一个值的方法
  • ABAQUS应用11——支座弹簧
  • HTML3D旋转相册
  • vue3 在store的index.js
  • scala 类的继承
  • 2009年国赛高教杯数学建模A题制动器试验台的控制方法分析解题全过程文档及程序
  • 在Windows下使用MFC/Win32 API进行文件夹内所有文件的复制操作,可以通过遍历目录中的文件并逐个复制来实现
  • Android Studio 的 Gradle 任务列表只显示测试任务
  • 51单片机应用开发---外部中断(按键为例)
  • adminPage-vue3依赖 v1.2.0新增组件 DetailsModule说明文档
  • SOC启动
  • Dockerfile 中,把多个 RUN 合并在一起,能减少镜像尺寸吗?
  • 室内定位论文整理-20241016
  • 考拉悠然CEO沈复民受邀出席人工智能建议提案办理座谈会并发言
  • 【踩坑日记36】ModuleNotFoundError: No module named ‘taming‘
  • PyTorch 中各类损失函数介绍
  • 【GT240X】如何在 Linux 中格式化磁盘