编辑
2025-09-29
C#
00

BackgroundWorker

image.png

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(); } } }
编辑
2025-09-29
C#
00

摘要

mciSendString 录制WAV

MCI(Media Control Interface,媒体控制接口)函数中,有些只适用于一种接口方式,有些则两种接口都可以用。mciSendString只适用于命令串接口方式(命令串中不区分大小写)。

正文

基础设置

set wave bitpersample 8 //设置为8位

set wave samplespersec 11025 //设置为11025Hz

set wave channels 2 //设置为立体声

导入winmm.dll

编辑
2025-09-29
C#
00

本文详细介绍如何使用C#创建串口监听服务,并将数据变化实时通过TCP转发到服务器。包含完整代码示例与实现思路,适合需要远程数据采集、工业设备监控的开发者参考。

在工业自动化、物联网设备管理、远程监控等应用场景中,经常需要将本地串口设备(如条码扫描枪、RFID读卡器、各类传感器)的数据实时传输到远程服务器进行处理。本文将详细讲解如何使用C#实现串口数据监听与TCP转发功能。

实现原理

我们的实现基于以下核心步骤:

  1. 创建串口监听服务,配置并打开串口
  2. 注册串口数据接收事件
  3. 当检测到串口数据变化时,通过TCP连接发送到远程服务器
  4. 实现稳定可靠的错误处理和重连机制
编辑
2025-09-29
C#
00

随着 C# 11 的发布,泛型属性(Generic Attributes)被引入到了语言中。在此之前,C# 中的属性不能有泛型类型参数,这在需要类型特定信息的某些场景中限制了它们的使用。这个新特性为开发者打开了编写更可重用、类型安全代码的大门。

应用场景

泛型属性可以用于多种场景,包括但不限于:

  • 数据注解:增强模型属性的元数据描述,例如为数据库模型指定列名和默认值。
  • 配置系统:在配置系统中,泛型属性可以用于标识特定类型的配置选项。
  • 依赖注入:标注需要注入的服务类型,提高依赖注入的类型安全性。
  • 插件和扩展系统:定义插件的元数据,如类型、版本等。
  • 自定义序列化/反序列化:在序列化和反序列化过程中,泛型属性可以提供类型特定的指令。

特点

  • 类型安全:泛型属性提供了类型参数,使得属性的使用更加安全,减少了类型转换错误的可能性。
  • 可重用性:泛型属性可以在不同类型之间重用,提高了代码的可重用性。
  • 灵活性:泛型属性可以根据不同的类型参数进行调整,提供了更大的灵活性。

示例

以下是一些使用泛型属性的示例,以及如何在 C# 11 中运行测试。

编辑
2025-09-29
C#
00

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

image.png