我用 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),我是否必须“照顾”它们以使它们成为线程安全的(例如,通过lock
关键字)?