我有一个启动微型服务器类型的服务来为本地浏览器提供网页的胜利表格,现在的问题是,当我启动它时,应用程序显然不会运行,因为存在一个等待请求的循环,对于创建新线程的每个请求。现在我应该为整个过程创建一个完整的新线程,还是有另一种方式?该类在我创建的单独的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