2011-01-13 121 views
1

我有一个C#HttpListener,它运行在单个线程上并解析由另一个程序发送给它的数据。我的主要问题不是所有发送到服务器的数据都收到了。我只假设这是由于它在单个线程上运行的限制。我已经搜索了一个简单的多线程解决方案的高和低,所以它可能会收到发送给它的数据,并空手。任何帮助将其转换为多线程应用程序将不胜感激。C#从单线程切换到多线程

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

回答

1

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

  1. 有多少数据被发送
  2. 多少数据被接收
  3. 多久
  4. 多长时间需要对数据
  5. 操作做才能发送数据

HTTP在TCP上工作,TCP通常保证传送,所以即使需要很长时间,您的服务器也应该获取所有传入的信息。

这就是说,如果你仍然想使这一进程多线程的,我会建议如下设计:

喜欢你
  1. 一个线程都现在(监听线程),接受传入数据。
  2. 另一组将处理传入数据的线程(WORKER THREADS)。
  3. 侦听器线程只会接收数据并将其放入队列中。
  4. 工作线程将使队列出队并操作数据。

一些笔记和事情要考虑,但:

  1. 保重线程同步的 - 特别是,你需要保护的队列。
  2. 想想问一下哪个工作线程会获取数据。如果有几个区块需要照顾特定的工作线程,那么您需要解决这个问题。
  3. 在某些情况下,如果监听线程负载非常高,队列可能会成为瓶颈,或者更确切地说 - 队列上的锁定可能会成为瓶颈。在这种情况下,我建议移动到N个工作线程的N个队列的模型中,并让侦听器以循环方式选择一个。这将最大限度地减少锁,因为你将有一个阅读器和一个作家,甚至可以在没有锁的情况下离开(但这超出了该答案的范围)。

还有一种选择是使用线程池。线程池是一个线程池,它们在需要时一直处于休眠状态。当侦听器得到一个输入输入时,它会将它分配给一个空闲线程,或者如果需要的话会扩大池;这样你没有一个队列,并且你的线程被优化使用。