BackgroundWorker

C#using System.ComponentModel;
namespace threadexp
{
public partial class FrmMain : Form
{
//实例化BackgroundWorker
private BackgroundWorker bgWorker = new BackgroundWorker();
public FrmMain()
{
InitializeComponent();
}
private void FrmMain_Load(object sender, EventArgs e)
{
pbar.Maximum = 1000;
//是否报告处理进度
bgWorker.WorkerReportsProgress = true;
//是否允许取消操作
bgWorker.WorkerSupportsCancellation = true;
//执行三个事件,DoWork事件,ProgressChanged事件以及RunWorkedCompleted事件
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);
}
public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
//设置进度条Maximum为1000,循环1000次
for (int i = 0; i <= 1000; i++)
{
//获取是否取消操作
if (bgWorker.CancellationPending)
{
e.Cancel = true;
return;
}
else
{
//报告进度
bgWorker.ReportProgress(i, "Working");
System.Threading.Thread.Sleep(10);
}
}
}
public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e)
{
//e.ProgressPercentage是获取任务int类型
pbar.Value = e.ProgressPercentage;
lblTitle.Text = "处理进度:" + Convert.ToString(e.ProgressPercentage);
}
public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//若没有完全执行结束,则报错
if (e.Error != null)
{
MessageBox.Show(e.Error.ToString());
return;
}
if (!e.Cancelled)
this.lblTitle.Text = "处理完毕!";
else
this.lblTitle.Text = "处理终止!";
}
//开始
private void btnStart_Click(object sender, EventArgs e)
{
//正忙时不允许继续操作
if (bgWorker.IsBusy)
return;
//异步开启
bgWorker.RunWorkerAsync("start");
}
//停止
private void btnStop_Click(object sender, EventArgs e)
{
bgWorker.CancelAsync();
}
}
}
本文详细介绍如何使用C#创建串口监听服务,并将数据变化实时通过TCP转发到服务器。包含完整代码示例与实现思路,适合需要远程数据采集、工业设备监控的开发者参考。
在工业自动化、物联网设备管理、远程监控等应用场景中,经常需要将本地串口设备(如条码扫描枪、RFID读卡器、各类传感器)的数据实时传输到远程服务器进行处理。本文将详细讲解如何使用C#实现串口数据监听与TCP转发功能。
我们的实现基于以下核心步骤:
随着 C# 11 的发布,泛型属性(Generic Attributes)被引入到了语言中。在此之前,C# 中的属性不能有泛型类型参数,这在需要类型特定信息的某些场景中限制了它们的使用。这个新特性为开发者打开了编写更可重用、类型安全代码的大门。
泛型属性可以用于多种场景,包括但不限于:
以下是一些使用泛型属性的示例,以及如何在 C# 11 中运行测试。
C# 中的 default 关键字是一个非常有用的特性,它用于获取一个类型的默认值。这个关键字在不同的场景下有不同的用途,包括泛型编程、可空类型处理以及提供参数的默认值等。本文将详细介绍 default 关键字的用法和一些实际应用场景。
default 关键字的基本用法default 关键字可以用来获取任何数据类型的默认值。对于值类型,default 返回的是该类型的默认值,通常是零或者其等价形式(比如 0 对于整数类型,false 对于布尔类型)。对于引用类型,default 返回的是 null。
C#int defaultInt = default(int); // 结果为 0
bool defaultBool = default(bool); // 结果为 false
string defaultString = default(string); // 结果为 null
DateTime defaultDateTime = default(DateTime); // 结果为 DateTime.MinValue
