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

时间:2011-01-13 06:02:49

标签: c# .net multithreading

我有一个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();
        }
    }

2 个答案:

答案 0 :(得分:1)

首先要做的是:确认您的假设确实是正确的。你需要检查:

  1. 发送了多少数据
  2. 收到多少数据
  3. 发送数据需要多长时间
  4. 操作数据需要多长时间
  5. HTTP通过TCP工作,这通常可以保证交付,因此即使需要很长时间,您的服务器也应该获取所有传入的信息。

    那就是说,如果你仍然想让这个过程多线程,我会推荐以下设计:

    1. 您现在拥有的一个线程( LISTENER THREAD )接受传入的数据。
    2. 另一组将处理传入数据的线程( WORKER THREADS )。
    3. 侦听器线程只接收数据并将其放入队列中。
    4. 工作线程将队列出列并对数据进行操作。
    5. 要考虑几个注意事项:

      1. 负责线程同步 - 具体来说,您需要保护队列。
      2. 认为哪个工作线程获取数据是否重要。如果有几个块需要处理特定的工作线程,则需要解决此问题。
      3. 在某些情况下,如果侦听器线程上的负载非常高,则队列可能会成为瓶颈,或者更准确地说 - 队列上的锁定可能会成为瓶颈。在这种情况下,我建议移植到N个工作线程的N队列模型中,并让听众以循环方式选择一个。这将最大限度地减少锁定,实际上因为你有一个阅读器和一个编写器,你甚至可以在没有锁定的情况下逃脱(但这超出了答案的范围)。
      4. 另一种选择是使用线程池。线程池是一个在需要之前休眠的线程池。当侦听器获取传入输入时,它会将其分配给一个空闲线程,或者在需要时将扩大池;这样您就没有队列,并且您的线程得到了最佳使用。

答案 1 :(得分:1)