2010-10-05 42 views
0

目前我正在写一个小型网络服务器,并为服务器获取的每个请求创建一个新的线程。 基本上是这样的:如何在线程中封装一个方法?

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#中创建自己的线程? 我只知道这个从Java,所以我有点糊涂了,这不是在C#中可能...

回答

0

我试图组成一个新的类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; 
    } 
} 

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