LoadXMLThread 方法展示如何從本地 XML 文件讀取資料、解析節點並即時推送至所有連線客戶端:
public void LoadXMLThread() {
MethodInvoker miv = new MethodInvoker(this.UpdateListView);
string tmp = null, XMLString = null;
int recordFlg = -1, textCount = 0;
XMLString = "\v" + " version='1.0'?>";
XmlTextReader tr = new XmlTextReader("issue.XML");
while (tr.Read()) {
switch (tr.NodeType) {
case XmlNodeType.Element:
if (tr.Name == "Issue") {
recordFlg++;
if (recordFlg > 0) {
textCount = 0;
xmlString += CreateXMLElement(tr.Name, 2);
XMLString += "\n";
SendDataToAllClient(XMLString);
XMLString = "\v" + " version='1.0'?>";
this.BeginInvoke(miv);
JobDone.WaitOne();
}
}
if (recordFlg >= 0) {
xmlString += CreateXMLElement(tr.Name, 1);
tmp = tr.Name;
}
break;
case XmlNodeType.Text:
switch (++textCount) {
case 1: isu.symbol = tr.Value; break;
case 2: isu.bid = tr.Value; break;
case 3: isu.offer = tr.Value; break;
case 4: isu.volume = tr.Value; break;
}
XMLString += tr.Value;
xmlString += CreateXMLElement(tmp, 2);
break;
}
}
fThd.Abort();
}
string CreateXMLElement(string elem, int ord) {
if (ord == 1) return String.Format("<{0}>", elem);
else return String.Format("{0}>", elem);
}
關鍵點:
XmlTextReader 快速前向讀取 XML,記憶體效率高。SendDataToAllClient 廣播。BeginInvoke(miv) 將 UI 更新委派至主執行緒,JobDone.WaitOne() 同步等待 UI 更新完成,確保資料一致性。\v (VT) 為訊息起始、\n 為結束標記,提升客戶端解析穩定性。private void UpdateListView() {
int ind = -1;
for (int i = 0; i < this.listView1.Items.Count; i++)
if (this.listView1.Items[i].Text == isu.symbol.ToString()) { ind = i; break; }
if (ind == -1) {
// 新增項目
ListViewItem newItem = new ListViewItem(isu.symbol.ToString());
newItem.SubItems.AddRange(new[] { isu.bid, isu.offer, isu.volume });
this.listView1.Items.Add(newItem);
int i = this.listView1.Items.IndexOf(newItem);
setRowColor(i, Color.FromArgb(255, 255, 175));
setColColorHL(i, 0, Color.FromArgb(128, 0, 0));
setColColorHL(i, 1, Color.FromArgb(128, 0, 0));
this.listView1.Update();
Thread.Sleep(300); // 視覺閃爍效果
setColColor(i, 0, Color.FromArgb(255, 255, 175));
setColColor(i, 1, Color.FromArgb(255, 255, 175));
} else {
// 更新現有項目
this.listView1.Items[ind].Text = isu.symbol.ToString();
this.listView1.Items[ind].SubItems[1].Text = isu.bid;
this.listView1.Items[ind].SubItems[2].Text = isu.offer;
this.listView1.Items[ind].SubItems[3].Text = isu.volume;
setColColorHL(ind, 0, Color.FromArgb(128, 0, 0));
setColColorHL(ind, 1, Color.FromArgb(128, 0, 0));
this.listView1.Update();
Thread.Sleep(300);
setColColor(ind, 0, Color.FromArgb(255, 255, 175));
setColColor(ind, 1, Color.FromArgb(255, 255, 175));
}
JobDone.Set();
}
輔助方法 setRowColor、setColColor、setColColorHL 實現交替列底色、欄位高亮閃爍效果,提升即時資料可讀性。
TcpServer.exe。TcpClient.exe。注意: 確保 Data file、Issue.txt、Issue.XML 與執行檔位於同一根目錄。HashTable 存取需加鎖確保執行緒安全。伺服器發送訊息前後加入起始/結束字元,增強客戶端穩定性。