C# 在后台运行类

C# 在后台运行类,c#,asp.net,multithreading,C#,Asp.net,Multithreading,我有一个win表单,它启动一个小型服务器类型的东西,将网页提供给本地浏览器,现在的问题是,当我启动它时,应用程序显然不会运行,因为有一个循环等待请求,对于每个请求,我都创建一个新线程。现在,我应该为整个流程创建一个完整的新线程,还是有其他方法?该类位于我创建的一个单独的dll文件中。单是它就如预期的那样完美地工作 这里有两种方法: 异步服务器。难度更大,性能更好 每个客户端一个线程。易于编写,但如果您有许多客户,则不适用 在请求之前不要使用循环这里有两种方法: 异步服务器。难度更大,性能更好 每

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

这里有两种方法:

  • 异步服务器。难度更大,性能更好

  • 每个客户端一个线程。易于编写,但如果您有许多客户,则不适用


  • 在请求之前不要使用循环这里有两种方法:

  • 异步服务器。难度更大,性能更好

  • 每个客户端一个线程。易于编写,但如果您有许多客户,则不适用


  • 在请求之前不要使用循环

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

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

    要将方法排队执行,只需使用:

    如果您意识到需要更多活动并发线程来为客户机服务,请致电:


    对于工作线程和I/O线程,在线程池线程可用之前,所有高于这些数量的请求都将保持排队状态。

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

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

    要将方法排队执行,只需使用:

    如果您意识到需要更多活动并发线程来为客户机服务,请致电:


    在线程池线程变为可用之前,所有高于这些数目的工作线程和I/O线程请求都将保持排队状态。

    我将遵循@Thomas建议,但将
    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();
    }
    

    我会遵循@Thomas的建议,但会向线程池中添加
    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();
    }
    

    只有一个客户,将来也只有一个客户只有一个客户,将来也只有一个客户
    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();
    }