2012-10-09 57 views
1

我使用C#,.NET Framework 3.5的軟件開發把延遲。我的應用程序一次通過TCP/IP連接到多個客戶端,並從中收集一些數據。客戶號碼非常高(超過100)。在我的應用程序開發過程之前,我已經做了一些研究,並且看到我必須在性能和可管理性方面使用異步套接字實現。
使用異步套接字方法時

似乎好現在,但我目前正在尋找將延遲只是一個數據發送到客戶端之前,最好的方式。我的應用程序有時需要等待大約2秒才能發送特定的數據。目前,我只是在異步發送方法之前放置了System.Threading.Thread.Sleep(2000);的代碼行。這是方便的方式還是有更好的方法呢?這個Sleep函數是否阻塞了我的主應用程序線程,還是阻塞了只屬於異步套接字線程的線程?

+0

可能大家知道所需的延遲的原因嗎?這似乎有點奇怪,故意延遲 –

+0

@AlastairPitts我把延遲,因爲客戶端機器需要延遲一些操作後。他們不會在幾秒鐘內回覆任何命令。 – Fer

+0

更好的選擇是在客戶端準備好後緩衝客戶端數據並使用數據。一個asnyc tcp(或其他)客戶端的方式。 – HuseyinUslu

回答

1

我會用一個定時器,而不是一個匿名方法,Thread.sleep代碼是(在大多數情況下)邪惡......

System.Threading.Timer timer; 
timer = new Timer((cs) => 
    { 
     ...asynchronous send here 
     timer.Dispose(); 
    }, null, 2000, Timeout.Inifinite); 

這意味着,括號中的代碼將在2000年後的毫秒運行一次。

timer.Dispose()線是非常重要的,還有就是你可以有多少未予處置計時器有一個限度。

+0

我怎麼知道我可以擁有的不定期定時器的數量?這個數字是否與我的應用程序可以創建的線程數量相同?其實我想知道你的建議是否爲等待操作創建了一個新的線程。如果是這樣,與Thread.Sleep方法非常相似,我想它會非常地降低性能。 – Fer

+0

在我執行我認爲這是約50-60定時器,可以在同一時間激活,所以你可能需要使用一些限制,如果你打算做一個100個請求測試。是的,每個匿名方法都會在它自己的線程上執行,但是線程的壽命很短,因爲您所做的只是異步發送和Dispose。如果你在一個線程上放置一個Thread.Sleep(2000),你可以保證它至少能活2000毫秒,而在它的大部分生命週期內沒有任何用處。 –

+0

好的我相信你的解決方案比Thread.Sleep更好。不過,我認爲會有比線程或計時器等待更好的解決方案。我認爲可能有一個SendAsync函數重載,它以某種方式接受延遲參數,並在內部發送數據之前等待延遲的時間。這會很有用。 – Fer