可以使用委托和线程,将串口操作从 UI 线程中分离出来,使 IsBusy 状态能够被正确更新。下面以 C# 为例:
delegate void SerialOperationDelegate(string portName, int baudRate, CancellationToken token);
private void SerialOperation(string portName, int baudRate, CancellationToken token)
{
// 创建串口对象和设置
using (SerialPort serialPort = new SerialPort(portName, baudRate))
{
// 打开串口
serialPort.Open();
// 串口操作代码...
// 判断是否取消操作
if (token.IsCancellationRequested)
{
// 执行取消操作代码...
}
}
}
private CancellationTokenSource cancellationTokenSource;
private SerialOperationDelegate serialOperationDelegate;
private BackgroundWorker backgroundWorker;
public Form1()
{
InitializeComponent();
// 创建 CancellationTokenSource 对象
cancellationTokenSource = new CancellationTokenSource();
// 创建 SerialOperationDelegate 委托
serialOperationDelegate = new SerialOperationDelegate(SerialOperation);
// 创建 BackgroundWorker 对象
backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork += BackgroundWorker_DoWork;
backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged;
backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
}
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// 获取串口参数
string portName = "COM1";
int baudRate = 9600;
// 开始串口操作
serialOperationDelegate.Invoke(portName, baudRate, cancellationTokenSource.Token);
}
private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// 更新 UI 上的进度条或状态文本