C#代碼給我的感覺是只執行一次。一般地,C#代碼是和界面里的控制元件關聯,后者點擊一下,相應的代碼就執行一下。但是許多地方的控制元件不會一直點擊,而只會點擊一次,那如何保證其關聯的代碼能得到持續性地運行?
uj5u.com熱心網友回復:
什么叫“持續性運行”? 死回圈?uj5u.com熱心網友回復:
就是說,C#接收外部的資料,但是外部的資料是動態的,C#要時時重繪
uj5u.com熱心網友回復:
看之前的提問,應該是之前寫PLC寫代碼,現在想要寫上位機代碼,想自己用c#寫吧?c#是通用語言,和plc的思路不太一樣,直接套用之前的思路寫可能是有很多問題
你的需求是不是類似點一個按鈕,就比如開始讀取下位機的資料,但下位機可能一直在寫資料,所以讀取是個持續性的程序?如果是這樣的話,思路應該是有個后臺行程來處理讀取,他是一直在執行的,按鈕只是控制后臺行程開始和結束。
uj5u.com熱心網友回復:
控制元件事件系結肯定只有在控制元件事件觸發后開始執行代碼。如果是持續接收外部資料,譬如說串口通訊或者Socket通信,那就需要重新開一個thread進行持續監聽,執行緒中用delegate invoke去更新前臺控制元件。uj5u.com熱心網友回復:
是這樣的。請問怎么做?
uj5u.com熱心網友回復:
看一下回圈體uj5u.com熱心網友回復:
希望穩定地運行,可以創建 Windows服務程式。uj5u.com熱心網友回復:
實在想不通你對程式執行的邏輯理解基本沒概念,但直接上手干活的勇氣哪里來的。你的問題可以類比一下
你按下開關,電視機就持續播放,那么你的按鈕事件就僅僅是一個開關,持續播放就是一個執行緒。那么,你就需要吧持續執行的內容放在一個回圈里,并啟動為執行緒,按鈕只是開啟執行緒。
uj5u.com熱心網友回復:
非常感謝您的答復。我現在差不多理解了。
那么,回圈用哪個好?for, while(true)?
uj5u.com熱心網友回復:
真心佩服老弟你的毅力,加油.uj5u.com熱心網友回復:
雖然現在有很多實作方法,我還是推薦BackgroundWorker 類來做,這個比較簡單,之前的版本就一直有支持
你可以先看下 msdn https://docs.microsoft.com/zh-cn/dotnet/api/system.componentmodel.backgroundworker?view=net-5.0
意思就是 BackgroundWorker 有個 DoWork 事件,你在這個事件里寫死回圈也行,判斷收到什么資料結束也行。
按鈕事件里讓這個物件執行 .RunWorkerAsync(); 方法就行
uj5u.com熱心網友回復:
如果完全按照你的思路,其實也是可以實作的,就是在按鈕里寫個while(true) 死回圈,不停讀取資料,只是這樣的程式執行界面會卡死,因為讀取的執行緒和拖界面的執行緒是同一個,你那邊死回圈了,滑鼠就拖不動界面了,在回圈里加一條 Application.DoEvents(); 陳述句,可以讓程式每次回圈都處理一下其他事件,可以緩解卡死的問題,但這種方法很不幽雅。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/260820.html
標籤:C#
下一篇:雙螢屏顯示問題
