//
using MvvmScaffoldFrame48.Model.ResultModel;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MvvmScaffoldFrame48.DLL.ThreadManager
{
///
/// 通信线程管理类
/// 管理通信线程的生命周期和数据传输
///
public class CommunicationThread
{
#region 变量与实例
public bool IsRunning { get; private set; }
public CancellationTokenSource CancellationTokenSource { get; private set; }
public Task CommunicationTask { get; private set; }
// 待发送数据队列
private readonly ConcurrentQueue _dataQueue = new ConcurrentQueue();
private readonly SemaphoreSlim _queueSemaphore = new SemaphoreSlim(0);
#endregion
#region 公共方法
///
/// 发送数据到通信设备
///
public void SendData(CameraProcessEventArgsResultModel data)
{
_dataQueue.Enqueue(data);
_queueSemaphore.Release();
}
///
/// 启动通信线程
///
public void Start()
{
if (IsRunning)
return;
CancellationTokenSource = new CancellationTokenSource();
var token = CancellationTokenSource.Token;
CommunicationTask = Task.Factory.StartNew(() => CommunicationLoop(token),
token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
IsRunning = true;
Console.WriteLine("通信线程已启动");
}
///
/// 停止通信线程
///
public async void Stop()
{
if (!IsRunning)
return;
CancellationTokenSource.Cancel();
try
{
if (CommunicationTask != null)
await CommunicationTask;
}
catch (OperationCanceledException)
{
// 正常取消
}
IsRunning = false;
Console.WriteLine("通信线程已停止");
}
#endregion
#region 私有方法
private async void CommunicationLoop(CancellationToken token)
{
try
{
while (!token.IsCancellationRequested)
{
// 等待数据
await _queueSemaphore.WaitAsync(token);
// 从队列获取数据
if (_dataQueue.TryDequeue(out CameraProcessEventArgsResultModel data))
{
// 执行通信逻辑
PerformCommunication(data);
}
// 1ms休眠
await Task.Delay(1, token);
}
}
catch (OperationCanceledException)
{
// 线程被取消,正常退出
}
catch (Exception ex)
{
Console.WriteLine($"通信线程异常: {ex.Message}");
}
}
private void PerformCommunication(CameraProcessEventArgsResultModel data)
{
// 实现具体通信逻辑
Console.WriteLine($"通信线程发送数据: 相机{data.CameraId}, 时间{data.Timestamp}");
}
#endregion
}
}