在后台运行类

时间:2013-02-19 00:17:41

标签: c# asp.net multithreading

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

3 个答案:

答案 0 :(得分: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

  3. 在请求

    之前不要使用循环

答案 1 :(得分:1)

我建议你看看ThreadPool Class。它是一个易于使用的选项,用于处理多个线程:

  

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

要对执行方法进行排队,只需使用QueueUserWorkItem Method

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

如果您意识到需要更多活动并发线程来为您的客户提供服务,请致电SetMaxThreads Method

ThreadPool.SetMaxThreads(50, 10);

在线程池线程可用之前,所有超过工作线程和I / O线程数的请求都会保持排队。

答案 2 :(得分:1)

我会关注@Thomas建议,但会在你的ThreadPool中添加waitHandles来管理回调周期。

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();
}