狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#-關于TcpListener的AcceptTcpClient()方法造成線程阻塞,進而程序無法徹底關閉的問題

admin
2021年2月23日 11:18 本文熱度 3585
在《C#高級編程》第7版第24章,有提到使用TCP類。
書中寫了一個實例,兩個winform,其中一個點擊按鈕發送字符串,另一個winform進行接收。這個實例有個缺點,只能接收一次。
我將這個實例進行了改造。第一版做好后,可以進行接收和發送,但是出現一個問題,就是在關閉程序后,在電腦的任務管理器中看到還有進程在跑。
進行了一些嘗試后改了第二版,終于解決了這個問題。
看一眼這個程序:


在兩臺電腦上分別運行此程序,注意要設置對方的IP地址。


我直接貼上第二版的代碼,然后在標明修改的哪兒。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;
  10. using System.Net;
  11. using System.Net.Sockets;
  12. using System.Threading;
  13. namespace TCPSend
  14. {
  15. public partial class Form1 : Form
  16. {
  17. //定義一個委托,用于更新Form1上控件。
  18. protected delegate void UpdateDisplayDelegate(string text);
  19. public Thread thread = null;
  20. public TcpClient tcpClientReceiver = null;
  21. TcpListener tcpListener = null;
  22. public Boolean boolStop = false;
  23. public Form1()
  24. {
  25. InitializeComponent();
  26. thread = new Thread(new ThreadStart(Listen));
  27. thread.Start();
  28. }
  29. public void Listen()
  30. {
  31. string LocalIp = GetSelfIp();
  32. if (LocalIp == null)
  33. {
  34. return;
  35. }
  36. IPAddress localAddr = IPAddress.Parse(LocalIp);
  37. Int32 port = 2112;
  38. tcpListener = new TcpListener(localAddr, port);
  39. tcpClientReceiver = new TcpClient();
  40. tcpListener.Start();
  41. while (true)
  42. {
  43. if (!tcpListener.Pending())
  44. {
  45. //為了避免每次都被tcpListener.AcceptTcpClient()阻塞線程,添加了此判斷,
  46. //no connection requests have arrived。
  47. //當沒有連接請求時,什么也不做,有了請求再執行到tcpListener.AcceptTcpClient()
  48. }
  49. else
  50. {
  51. tcpClientReceiver = tcpListener.AcceptTcpClient();
  52. NetworkStream ns = tcpClientReceiver.GetStream();
  53. StreamReader sr = new StreamReader(ns);
  54. string result = sr.ReadToEnd();
  55. Invoke(new UpdateDisplayDelegate(UpdateDisplay), new object[] { result });
  56. }
  57. if (boolStop)
  58. {
  59. break;
  60. }
  61. }
  62. }
  63. public void UpdateDisplay(string text)
  64. {
  65. string currentContents = textBox4.Text;
  66. currentContents += text+"\r\n"; //必須用"\r\n"在窗口中才能體現出換行
  67. textBox4.Text = currentContents;
  68. }
  69. //send message
  70. private void button1_Click(object sender, EventArgs e)
  71. {
  72. SendMessage();
  73. }
  74. public void SendMessage()
  75. {
  76. TcpClient tcpClient = new TcpClient(textBox1.Text, Int32.Parse(textBox2.Text));
  77. NetworkStream ns = tcpClient.GetStream();
  78. string message = textBox3.Text;
  79. byte[] contentBytes = Encoding.GetEncoding("utf-8").GetBytes(message); //將string類型轉換為byte[]
  80. for (int i = 0; i < contentBytes.Length; i++)
  81. {
  82. ns.WriteByte(contentBytes[i]);
  83. }
  84. ns.Close();
  85. tcpClient.Close();
  86. textBox3.Text = "";
  87. }
  88. //獲得本地的IP地址
  89. public string GetSelfIp()
  90. {
  91. System.Net.IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;
  92. if (addressList.Length == 1)
  93. {
  94. return addressList[0].ToString();
  95. }
  96. else
  97. {
  98. MessageBox.Show("當前只支持設置一個IP的電腦,您的電腦設有多個IP地址");
  99. }
  100. return null;
  101. }
  102. //在關閉之前,將boolStop設置為true,thread既可以結束了。
  103. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  104. {
  105. boolStop = true;
  106. }
  107. }
  108. }

相對于第一版,主要是添加了變量boolStop,用于控制線程中while循環結束的時機。第二點就是在while循環中增加了一個判斷,if (!tcpListener.Pending()),這樣在對方沒有發送消息時,是不會執行到tcpListener.AcceptTcpClient();的。這樣就不會造成線程的阻塞了。這樣直接關閉了winform,線程thread也會相應的結束。

否則就會造成如下的情況,關閉了程序,但是任務管理器中,仍然能夠看到進程。

該文章在 2021/2/23 11:18:36 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved