Как инкапсулировать из потока в методе? - PullRequest
0 голосов
/ 05 октября 2010

В настоящее время я пишу небольшой веб-сервер и создаю новую тему для каждого запроса, получаемого сервером.В основном это так:

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.Я думал о методе, подобном следующему:

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

Проблема в том, что мне тоже нужно передать объект контекста, но я не уверен, как это сделать потокобезопасным и что было бы лучшим способом.Я думал о создании нового класса, который наследуется от Thread и реализует метод ProcessRequest и новый метод EncapsulateMe.Будет ли это сложно для того, что я пытаюсь выполнить?

Редактировать: Я только что узнал, что невозможно написать класс в C #, который происходит от Thread, потому что этот класс запечатан ...Есть ли способ создать свои собственные темы в C #?Я просто знал это по Java, поэтому я немного растерялся, что это невозможно в c # ...

1 Ответ

0 голосов
/ 07 октября 2010

Я пытался составить новый класс 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;
  }
}

Но я не очень доволен этим решением ... мне оно кажется каким-то многим.Кто-нибудь получил меньшую / лучшую идею?

...