
private Queue queueTCPCacheReceived;
private Thread threadTCPCacheReceived;
static System.Threading.Timer Timer2 ;
private void ReceiveInformation2(Object state)//定時器用于接收資料
{
try
{
byte[] readBuffer = new byte[sock.ReceiveBufferSize];
int count = sock.Receive(readBuffer);
lock (queueTCPCacheReceived.SyncRoot)
{
for (int i = 0; i < count; i++)
{
queueTCPCacheReceived.Enqueue(readBuffer[i]);
}
}
}
catch (Exception ex)
{
string EM = ErrorMessage(ex);
timer1.Enabled = false;//UI停止更新
Timer2.Change(Timeout.Infinite, Timeout.Infinite);
sock.Close();
MessageBox.Show(EM, "錯誤");
return;
}
}
Timer2.Change(0, Timeout.Infinite);
}
private void ThreadTCPCacheReceivedFunction()
{
List<byte> listData = new List<byte>();
while (sock != null && sock.Connected)
{
int cacheLength = queueTCPCacheReceived.Count;
Console.WriteLine(cacheLength.ToString());
if (cacheLength > 0)
{
lock (queueTCPCacheReceived.SyncRoot)
{
for (int i = 0; i < cacheLength; i++)
{
if (listData.Count == 0)
{
if ((byte)queueTCPCacheReceived.Dequeue() == 0x55 && (byte)queueTCPCacheReceived.Dequeue() == 0x00)
{
listData.Add(0x55);
listData.Add(0x00);
}
}
else if (listData.Count > 0)
{
listData.Add((byte)queueTCPCacheReceived.Dequeue());
}
if (listData.Count == 896)
{
lock (queueTCPCacheReceived.SyncRoot)
{
byte[] byteData =listData.ToArray();
if (byteData[0] == 85 && byteData[895] == 238)//首尾驗證
{
if (nlink_linktrack_anchor_frame0.unpackAnchorFrame0Data(byteData, byteData.Length))
{
ErrorCount = 0;
}
}
}
listData.Clear();
}
}
}
}
}
queueTCPCacheReceived.Clear();
}
uj5u.com熱心網友回復:
你接收的時候,處理還沒回傳,所以...
uj5u.com熱心網友回復:
沒有回傳吧。uj5u.com熱心網友回復:
好像是cacheLength = queueTCPCacheReceived.Count比實際的佇列長度大。uj5u.com熱心網友回復:
我們現在選擇pipeline管道處理,如果你net版本低,那我們建議使用 BlockingCollection ,這是建議在來說你的代碼。Dequeue是獲取并移出。那么你移出了,他當然長度會變的
uj5u.com熱心網友回復:
但是我先獲取它的長度,再一個個移出,應該是剛好的才對啊。uj5u.com熱心網友回復:
而且我發現如果在獲取count之后,sleep一段時間,就不會出現這個現象了。但是延時增加了不少,不太滿足我的需求。uj5u.com熱心網友回復:
額。初始為9對把
現在我移除一個,現在是8對吧
你固定回圈9次,那么第9次當然是空的。
其實你自己都說了,cacheLength = queueTCPCacheReceived.Count 比實際的佇列長度大,因為實際佇列已經比你最早進來的時候小了
uj5u.com熱心網友回復:
哎呀,你自己都說是所謂的定時器了,在你sleep程序里,你不能保證你那個定時器不加東西
int cacheLength = queueTCPCacheReceived.Count;
Console.WriteLine(cacheLength.ToString());
if (cacheLength > 0)
{
lock (queueTCPCacheReceived.SyncRoot)
看見你鎖的順序了么,你又沒鎖他,只能說,你靠的不是邏輯,而是巧合,巧合的是你sleep的程序,定時器運行了,巧合的是,定時器不但運行了,而且他還真收到資料了
uj5u.com熱心網友回復:
如果使用“佇列”概念,那就說明你可能是使用上個世紀8、90年代的 unix 系統傳統風格思路。15年歷史的 .net 最“沉重”的做法
var x = 準備處理物件;的做法,或者最近5、6年的 Task.Run(.....) 做法,都是更合適的 .net 的做法。因為 .net 內置有系統級的強大任務佇列管理機制,處理了各種資料和控制問題,你不用,偏用很多年前基于底層編程的開源 java 上的一些代碼代碼,基于佇列自己寫一套 Pool 或者 Task 管理出來,丟了資料出錯誤很容易。
ThreadPool.QueueUserWorkItem(h => 異步處理訊息(x));
uj5u.com熱心網友回復:
你說的我一個字都聽不懂,哈哈。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/22840.html
標籤:C#
上一篇:Error 500
下一篇:這種情況建構式是否會執行?
