2013-08-16 57 views
0

我有一個vb.net應用程序,它像一個服務器(Echo),它允許客戶端(另一個應用程序)向服務器查詢不同類型的文件或其他文件。現在我面臨的問題是當應用程序(服務器)處於UP狀態時,它運行在單個線程上。但是,當來自同一臺機器或某個其他計算機的客戶端嘗試連接到服務器進行查詢時,應用程序會啓動另一個與服務器建立的連接的線程。因此,在調試服務器(VB.Net應用程序)時,我們發現從一個線程執行的操作的控制切換從服務器到達另一個線程時開始,當客戶機連接到服務器時啓動但我希望整個操作都是在服務器啓動的同一個線程上完成的。線程切換

客戶端嘗試連接到服務器後啓動的第二個線程是因爲我們使用第三方控件名稱Dart TCP來連接服務器和客戶端,其中客戶端連接到服務器,我們使用的是當客戶端連接,其被稱爲在初始化方法如下面方法的代碼:

server.start(新澤西ConnectThreadStart(AddressOf connectionstart),端口狀態)。 這裏,connectionstart是啓動連接的方法,並且可用於服務器和客戶端之間的通信,直到兩者中的任何一方結束連接。

任何解決方案或想法提供將不勝感激。提前感謝。

+0

可用只是爲了檢查 - 在Dart指的是dart.com的控件,與Google的Dart語言無關(添加的Dart標籤指Google Dart)。 –

+0

當你有多個線程執行代碼時,這是非常正常的,特別是如果它們執行相同的方法。如果兩個線程都處理網絡連接,那麼這是預期的。當然,調試比較困難,兩個線程都可能觸發斷點。首先確保它適用於一個連接。您可以使用「調試+ Windows +線程」調試器窗口凍結線程。 –

回答

0

如您所見,有一個新線程以新請求開始(這很好)。

使所有線程共享一些配置設置的一種(非常糟糕的)方法是使用線程安全變量來存儲配置。當一個線程需要訪問它時,它會獲得該變量的鎖定,讀取或寫入該鎖定,然後釋放該鎖定。

其中很不好的一部分是所有線程都依賴於一個資源 - 這可能會使整個應用程序比需要的更慢 - 一個請求可能會鎖定配置變量,而其他所有線程在需要時會停止閱讀。僵局。儘管如此,對於調試來說也許它已經足夠好了。

此處詳細瞭解鎖定的資源:http://support.microsoft.com/kb/816161

更好的事情(避免死鎖)將使用一個不可改變的數據結構,這在當今似乎通過NuGet ImmutableHashMap