C#从单线程切换到多线程

C#从单线程切换到多线程,c#,.net,multithreading,C#,.net,Multithreading,我有一个C#HttpListener,它在一个线程上运行,并解析另一个程序发送给它的数据。我的主要问题不是发送到服务器的所有数据都被接收。我只假设这是由于它在单个线程上运行的限制。我到处寻找一个简单的多线程解决方案,这样它就可以接收发送给它的所有数据,结果空手而归。如果您能帮助我们将其转换为多线程应用程序,我们将不胜感激 private void frmMain_Load(object sender, EventArgs e) { Thread t = new T

我有一个C#HttpListener,它在一个线程上运行,并解析另一个程序发送给它的数据。我的主要问题不是发送到服务器的所有数据都被接收。我只假设这是由于它在单个线程上运行的限制。我到处寻找一个简单的多线程解决方案,这样它就可以接收发送给它的所有数据,结果空手而归。如果您能帮助我们将其转换为多线程应用程序,我们将不胜感激

    private void frmMain_Load(object sender, EventArgs e)
    {
        Thread t = new Thread(new ThreadStart(ThreadProc));
        t.Start();
    }

    public static void ThreadProc()
    {
        while (true)
        {
            WebBot.SimpleListenerExample(new string[] { "http://localhost:13274/" });
            //Thread t = new Thread(new ThreadStart(ThreadProc));
            //t.Start();
            Application.DoEvents();
        }
    }

第一件事:确认你的假设确实正确。您需要检查:

  • 发送了多少数据
  • 接收到多少数据
  • 发送数据需要多长时间
  • 对数据进行操作需要多长时间
  • HTTP在TCP上工作,TCP通常保证传输,因此即使需要很长时间,您的服务器也应该获得所有传入的信息

    也就是说,如果您仍然希望使流程多线程化,我建议采用以下设计:

  • 现在有一个线程(侦听器线程),它接受传入的数据
  • 将处理传入数据的另一组线程(工作线程)
  • 侦听器线程将只接收数据并将其放入队列中
  • 工作线程将退出队列并对数据进行操作
  • 不过,有几点需要注意和思考:

  • 注意线程同步——特别是,您需要保护队列
  • 想想看哪个工作线程将获得数据是否重要。如果有几个块需要处理特定的工作线程,那么您需要解决这个问题
  • 在某些情况下,如果侦听器线程上的负载非常高,队列可能会成为瓶颈,或者更准确地说,队列上的锁定可能会成为瓶颈。在本例中,我建议将N个工作线程转移到N个队列的模型中,让侦听器以循环方式选择一个队列。这将最大限度地减少锁,事实上,由于您将有一个读写器,您甚至可以不带锁地离开(但这超出了该答案的范围) 另一种选择是使用线程池。线程池是在需要之前一直处于休眠状态的线程池。当监听器收到一个传入的输入时,它将把它分配给一个空闲线程,或者在需要时扩大池;这样,您就没有队列,线程得到了最佳利用

    可能会帮助您开始