0

我有一个 win 表单,它启动一个迷你服务器类型的东西来为本地浏览器提供网页,现在的问题是,当我启动它时,应用程序显然不会运行,因为有一个等待请求的循环,因为每个请求我都会创建一个新线程。现在我应该为整个过程创建一个完整的新线程还是有其他方法?该类位于我创建的单独的 dll 文件中。单独它可以按预期完美运行。

4

3 回答 3

1

这里有两种方法:

  1. 异步服务器。难度更高,性能更高。http://robjdavey.wordpress.com/2011/02/12/asynchronous-tcp-server-example/

  2. 每个客户端一个线程。易于编写,但如果您有很多客户,则不适用。http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server

在请求之前不要使用循环

于 2013-02-19T00:30:53.023 回答
1

我建议你看看ThreadPool 类。这是处理多个线程的易于使用的选项:

线程池通过为您的应用程序提供由系统管理的工作线程池,使您能够更有效地使用线程。

要将方法排队等待执行,只需使用QueueUserWorkItem 方法

ThreadPool.QueueUserWorkItem(state =>
{
    // do some work!
});

如果您意识到需要更多活动的并发线程来为您的客户端提供服务,请调用SetMaxThreads 方法

ThreadPool.SetMaxThreads(50, 10);

工作线程和 I/O 线程的所有高于这些数字的请求都将保持排队,直到线程池线程可用。

于 2013-02-19T00:37:51.153 回答
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();
}
于 2013-02-19T01:47:04.747 回答