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