我有我的主要 Winforms 應用程式。有 6 個執行緒在 parrael 主執行緒中作業,至少它是這樣的。我創建了一個執行緒,它是一個 Tcp 服務器,偵聽特定埠。
listenerThread = new Thread(new ThreadStart(AsynchronousSocketListener.StartListening));
listenerThread.Start();
我還有 5 個不同的執行緒在做不同型別的事情(例如更新資料庫、計算平均值/總和、作為 TCP 客戶端等)
我的問題是:當這 5 個不同執行緒中的一個執行緒將占用 CPU 的計算能力時,我的 TCP 服務器(正在 6 個執行緒之一上作業)是否可能不會讀取訊息,并且 TCP 服務器的執行緒執行緒將不得不讀取等待 ?
另一個問題:如果這可能發生,我該如何避免?
uj5u.com熱心網友回復:
這是我上面評論的總結
“當這 5 個不同執行緒中的一個執行緒將占用 CPU 的計算能力時,我的 TCP 服務器(正在 6 個執行緒之一上作業)是否可能無法讀取訊息,并且 TCP 服務器的執行緒執行緒將不得不等待?”
接收到的資料會在一定程度上緩沖,但是如果您的代碼沒有在適當的時間內回應,則可能會導致資料丟失。
在單核系統和另一個應用程式中也可以這樣說,比如Prime95忙于不玩好游戲并在你的旁邊計算素數。
另一個問題:如果這可能發生,我該如何避免?
在處理 I/O 時,我將重點關注 TCP 是在資料接收處理程式中執行最少量的處理,而不管該處理程式是表單IAsyncResult還是async/await.
一個好的一般流程是:
- 啟動異步讀取
- 異步讀取的讀取結果
- 將結果放入佇列
- 回圈回到#1
同時,您以不同的機制處理來自 #2 的讀取結果,無論是計時器;GUI應用程式空閑回圈;或者不同的執行緒只要處理結果的執行緒與上面的流程無關。
原因是在涉及相當高的資料傳輸率的情況下,如果您要讀取資料塊,然后立即更新顯示 1000 行的Telerik資料網格 UI,則下一次讀取操作很有可能導致資料丟失,因為您沒有在足夠的時間內做出回應。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/399895.html
