目前我正在编写一个小型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#...
答案 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;
}
}
但是我对这个解决方案并不满意......对我来说似乎有点太多了。任何人都有一个更小/更好的想法?