2010-10-05 3 views
0

Actuellement, j'écris un petit serveur web et je crée un nouveau Thread pour chaque requête que reçoit le serveur. Fondamentalement, il est comme ça:Comment encapsuler à partir d'un thread dans une méthode?

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

J'ai essayé de garder mon exemple simple. Évidemment, dans mon application, c'est un peu plus compliqué. Maintenant j'essaye d'encapsuler ce qui se passe ici dans la directive if-else. Je pensais à une méthode comme:

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

Le problème est que je dois transférer aussi l'objet de contexte, mais je ne suis pas sûr de savoir comment faire thread-safe et quelle serait la meilleure façon. J'ai pensé à créer une nouvelle classe dérivée de Thread et implémente la méthode ProcessRequest et la nouvelle méthode EncapsulateMe. Serait-ce compliqué pour ce que j'essaie d'accomplir?

Editer: Je viens de découvrir qu'il n'est pas possible d'écrire une classe dans C# qui dérive de Thread parce que cette classe est scellée ... est-il possible de créer vos propres Threads en C#? Je savais ce à partir de Java, donc je suis un peu confus qu'il est impossible dans C# ...

Répondre

0

J'ai essayé de composer une nouvelle ProcessRequestThread de classe avec un fil:

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

Mais je Je ne suis pas vraiment satisfait de cette solution ... il me semble que ce soit beaucoup. Quelqu'un a eu une idée plus petite/meilleure?

Questions connexes