項目中的代碼記錄日常
/// <summary>
/// 修改任務狀態
/// </summary>
private void StartProcess21()
{Process21Task = new Thread(() =>{while (CommonUtility.IsWorking){try{if (tPAgvTasksList.Count > 0){Parallel.ForEach(tPAgvTasksList, new ParallelOptions() { MaxDegreeOfParallelism = 16 }, item =>{// 判斷 一期 或 二期//var StagePlc = item.Stage == 1 ? PlcDevice1 : PlcDevice2;// 通知PLC動作完成PlcDevice1.Write(item.DbChunk, WriteNumber);PlcDevice2.Write(item.DbChunk, WriteNumber);Logger.Info($"PLC寫入狀態 , 偏移量:{item.DbChunk};訂單:{item.OrderId};狀態:{item.Status}");int Id = item.Id;int Sign = 1;// 修改數據庫查詢標記并保存_repository.UpdateTask(Id, Sign);ListItem = item;});// 移除當前對象tPAgvTasksList.Remove(ListItem);Logger.Info($"當前數據數量為:{tPAgvTasksList.Count()};");}}catch (Exception ex){Logger.Error($"異常信息:{ex.Message}");}// 短暫休眠Thread.Sleep(DormancyTimeCount);}});Process21Task.IsBackground = true;Process21Task.Start();
}
詳細解釋
- 方法定義
private void StartProcess21()
定義了一個名為 StartProcess21 的私有方法,用于啟動一個線程來修改任務狀態。
- 創建線程
Process21Task = new Thread(() =>
創建一個新的線程 Process21Task,并使用 lambda 表達式定義線程的主體。
- 循環條件
while (CommonUtility.IsWorking)
線程將在 CommonUtility.IsWorking 為 true 時持續運行。
- 異常處理
try
{// 代碼塊
}
catch (Exception ex)
{Logger.Error($"異常信息:{ex.Message}");
}
使用 try-catch 塊捕獲可能的異常,并在日志中記錄異常信息。
- 檢查任務列表
if (tPAgvTasksList.Count > 0)
檢查 tPAgvTasksList 列表中是否有任務需要處理。
- 并行處理任務
Parallel.ForEach(tPAgvTasksList, new ParallelOptions() { MaxDegreeOfParallelism = 16 }, item =>
{// 代碼塊
});
使用 Parallel.ForEach 并行處理 tPAgvTasksList 中的每個任務,最大并行度為 16。
- PLC寫入操作
PlcDevice1.Write(item.DbChunk, WriteNumber);
PlcDevice2.Write(item.DbChunk, WriteNumber);
Logger.Info($"PLC寫入狀態 , 偏移量:{item.DbChunk};訂單:{item.OrderId};狀態:{item.Status}");
向 PlcDevice1 和 PlcDevice2 寫入狀態,并在日志中記錄寫入信息。
- 更新數據庫標記
int Id = item.Id;
int Sign = 1;
_repository.UpdateTask(Id, Sign);
獲取任務的 Id 和設置標記 Sign 為 1,然后調用 _repository.UpdateTask 方法更新數據庫中的任務標記。
- 移除已經處理任務
ListItem = item;
tPAgvTasksList.Remove(ListItem);
Logger.Info($"當前數據數量為:{tPAgvTasksList.Count()};");
將當前處理的任務賦值給 ListItem,然后從 tPAgvTasksList 中移除該任務,并在日志中記錄當前任務列表的數量。
- 短暫休眠
Thread.Sleep(DormancyTimeCount);
線程休眠一段時間,避免過度占用 CPU 資源。
- 設置線程為后臺線程并啟動
Process21Task.IsBackground = true;
Process21Task.Start();
將 Process21Task 設置為后臺線程并啟動。
總結
該代碼的主要功能是啟動一個后臺線程,定期檢查并處理任務列表中的任務。具體步驟包括:
檢查任務列表中是否有任務需要處理。
并行處理每個任務,向 PLC 設備寫入狀態并更新數據庫中的任務標記。
從任務列表中移除已處理的任務。
在日志中記錄相關信息。
線程休眠一段時間后繼續檢查任務列表。
通過這種方式,代碼實現了任務狀態的異步更新和處理,確保系統的高效運行。