如何从方法中的线程封装?

时间:2010-10-05 07:17:23

标签: c# multithreading encapsulation

目前我正在编写一个小型Web服务器,我为服务器获取的每个请求创建一个新的Thread。 基本上就是这样:

public class MyController
{
    public void ProcessRequest(object contextObject)
    {
      HttpListenerContext context = (HttpListenerContext)contextObject;

      // handle request
      if (someCondition())
      {
        context.Response.StatusCode = 400;
        context.Response.StatusDescription = "Missing something";
      }
      else
      {
        context.Response.StatusCode = 200;
        context.Response.StatusDescription = "Everything OK";
      }
    }

    public void AcceptRequest()
    {
      while (true)
      {
        HttpListenerContext context = HttpListener.GetContext();
        Thread thread = new Thread(this.ProcessRequest);
        thread.Start(context);
      }
    }
}

我试图让我的例子变得简单。显然在我的应用程序中它有点复杂。 现在我尝试封装if-else-directive中发生的事情。我想到了一个方法:

public void EncapsulateMe(int code, string description)
{
  context.Response.StatusCode = code;
  context.Response.StatusDescription = description;
}

问题是我还需要传输上下文对象,但我不确定如何做到线程安全以及最好的方法。我想过创建一个派生自Thread的新类,并实现ProcessRequest方法和新的EncapsulateMe方法。对于我想要完成的事情,这会变得复杂吗?

编辑:我刚刚发现在c#中编写一个派生自Thread的类是不可能的,因为这个类是密封的......有没有办法在c#中创建自己的Thread? 我只是从Java知道这一点,所以我有点困惑,它在c#...

中是不可能的

1 个答案:

答案 0 :(得分:0)

我尝试使用Thread编写一个新类ProcessRequestThread:

public class ProcessRequestThread
{
  private Thread ProcessThread;
  private HttpListenerContext Context;

  public ProcessRequestThread()
  {
    ProcessThread = new Thread( ProcessRequest );
    ProcessThread.Start();
  }

  private void ProcessRequest(object contextObject)
  {
    Context = (HttpListenerContext)contextObject;

    // handle request
    if (someCondition())
    {
      EncapsulateMe(400, "Missing something");
    }
    else
    {
      EncapsulateMe(200, "Everything OK");
    }
  }

  private void EncapsulateMe(int code, string description)
  {
    Context.Response.StatusCode = code;
    Context.Response.StatusDescription = description;
  }
}

但是我对这个解决方案并不满意......对我来说似乎有点太多了。任何人都有一个更小/更好的想法?