我有一個啓動微型服務器類型的服務來爲本地瀏覽器提供網頁的勝利表格,現在的問題是,當我啓動它時,應用程序顯然不會運行,因爲存在一個等待請求的循環,對於創建新線程的每個請求。現在我應該爲整個過程創建一個完整的新線程,還是有另一種方式?該類在我創建的單獨的dll文件中。完全按預期完美工作。在後臺運行課程
Q
在後臺運行課程
0
A
回答
1
我建議你去看看ThreadPool Class不使用循環。這是一個易於使用的選項,用於處理多個線程:
通過爲應用程序提供由系統管理的工作線程池,可以更高效地使用線程池。
要排隊等待執行的方法簡單地使用QueueUserWorkItem Method:
ThreadPool.QueueUserWorkItem(state =>
{
// do some work!
});
如果你意識到你需要更積極的併發線程來服務你的客戶,請撥打SetMaxThreads Method:
ThreadPool.SetMaxThreads(50, 10);
對於工作線程和I/O線程,高於這些數字的所有請求都保持排隊,直到線程池線程可用。
1
有兩種方法在這裏:
異步服務器。更難和更多的表現。 http://robjdavey.wordpress.com/2011/02/12/asynchronous-tcp-server-example/
每個客戶端一個線程。易於編寫但不適用,如果你有很多客戶。 http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server
直到請求
1
我會按照@Thomas的建議,但將waitHandles
添加到您的ThreadPool來管理回調循環。
WaitCallback classMethod1= new WaitCallback(DoClassMethod1);
bool isQueued = ThreadPool.QueueUserWorkItem(classMethod1, waitHandle[0]);
WaitCallback classMethod2= new WaitCallback(DoClassMethod2);
bool isQueued = ThreadPool.QueueUserWorkItem(classMethod2, waitHandle[1]);
// do this if you want to wait for all requests complated
if (WaitHandle.WaitAll(waitHandles, 5000, false))
// request completed, show your result.
else
// problem.
void DoClassMethod1(object state)
{
// do your work
ManualResetEvent mre = (ManualResetEvent)state;
mre.Set();
}
相關問題
- 1. 線程是否可運行?或上課?如何在後臺運行線程?
- 2. 在後臺運行程序
- 3. 在後臺運行程序
- 4. 在後臺運行進程
- 5. 在後臺運行線程
- 6. 在onReceive調用課堂活動以在後臺運行
- 7. 運行在後臺
- 8. 在後臺運行
- 9. 在後臺運行
- 10. 運行在後臺
- 11. Spotify - 運行後臺進程
- 12. WP7後臺進程運行
- 13. 運行後臺進程
- 14. 在後臺運行並行
- 15. 在後臺運行一個gui程序
- 16. 一個程序,在後臺運行(JAVA)
- 17. 在後臺運行的程序
- 18. 如何在後臺運行Python程序?
- 19. 程序沒有在後臺運行
- 20. detach std ::線程在後臺運行
- 21. Excel進程仍在後臺運行
- 22. Android線程未在後臺運行
- 23. 在後臺運行應用程序IntentService
- 24. Ruby在後臺運行進程
- 25. 如何讓程序在後臺運行?
- 26. 在後臺運行的Java程序
- 27. Android應用程序在後臺運行
- 28. 在Android中運行後臺進程
- 29. Android,在後臺運行應用程序
- 30. 在後臺運行應用程序
只有一個客戶端,只會有一個客戶端 – FabianCook 2013-02-19 01:38:18