我用C#编写了一个简单的多线程Web服务器(代码的一部分):
public class MyServer
{
private readonly HttpListener _listener = new HttpListener();
private int _dataId;
public HttpServer(string prefix, string folder)
{
System.Threading.ThreadPool.SetMaxThreads(50, 1000);
System.Threading.ThreadPool.SetMinThreads(50, 50);
//........
}
public void Start()
{
_listener.Start();
while (true)
ThreadPool.QueueUserWorkItem(ProcessRequest, _listener.GetContext());
}
private void ProcessRequest(object obj)
{
//.....
}
}
如果通过浏览器发送请求(或者只使用一个主线程),则一切正常。但是,如果通过下面的代码执行,那么服务器通常会为不同的请求接收相同的值:
你的想法?
- 修改 - :
简单的问题是,仅使用局部变量确保我的代码是线程安全的吗?反之亦然:如果我正在使用实例变量(不是静态的,在我的情况下是_dataId ),我必须“照顾”它们以使它们成为线程安全的(例如,{{1} }关键字)?
答案 0 :(得分:1)
以多线程方式使用HttpListener的规范方法是通过Begin / End异步模式here is an example。
如果你的处理程序方法是可重入的,即它不依赖于任何实例状态,那么代码是线程安全的可能性很大。问题是你使用的任何类,方法等是否也是线程安全的。
答案 1 :(得分:-1)
你应该在循环调用GetContext中启动另一个线程,而不是多次排队相同的上下文。
public void Start()
{
_listener.Start();
ThreadPool.QueueUserWorkItem(StartImpl);
}
public void StartImpl()
{
while (true)
ProcessRequest(_listener.GetContext());
}