1

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

4

2 回答 2

1

以多线程方式使用 HttpListener 的规范方法是通过 Begin/End 异步模式,这里是一个示例

如果您的处理程序方法是可重入的,即它不依赖于任何实例状态,那么代码很有可能是线程安全的。问题是您使用的任何类、方法等是否也是线程安全的。

于 2012-11-04T17:45:01.053 回答
-1

您应该启动另一个线程,该线程将循环调用 GetContext,而不是多次排队同一个上下文。

public void Start()
{
    _listener.Start();
    ThreadPool.QueueUserWorkItem(StartImpl);
}
public void StartImpl()
{
    while (true)
        ProcessRequest(_listener.GetContext());
}
于 2012-11-04T15:58:27.860 回答