自定义多线程Http Server不是线程安全的

时间:2012-11-04 15:35:19

标签: c# .net multithreading scheduled-tasks

我用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} }关键字)?

2 个答案:

答案 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());
}