【发布时间】:2011-09-16 08:04:47
【问题描述】:
我在 c# .NET 中实现了一个 HTTP 服务器:
public class HttpServer
{
private HttpListener listener;
public HttpServer()
{
listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8080/");
}
public void Start()
{
lock(this) {
listener.Start();
AsyncProcessing(listener);
}
}
public void Stop()
{
lock (this) {
listener.Stop();
}
}
private void AsyncProcessing(HttpListener listener)
{
if (listener == null)
return;
listener.BeginGetContext(new AsyncCallback(Callback), listener);
}
private void Callback(IAsyncResult result)
{
HttpListenerContext context = null;
lock(this) {
HttpListener listener = (HttpListener)result.AsyncState;
if (!listener.IsListening)
return;
context = listener.EndGetContext(result);
AsyncProcessing(listener);
}
/* handle request */
}
}
我对此实现有一些疑问:
- 我在这里和那里添加了一些锁来防止竞争条件,但我很困惑:真的需要这些吗?我在文档中读到所有公共非静态方法都不是线程安全的。为什么我没有看到考虑到这一事实的代码?
- HttpListenerContext 的行为如何?他是否与 HttpListener 有某种联系?或者我可以同时使用多个 HttpListenerContexts 吗?
- 我听说 HttpListener 不会为生产系统做好准备,但我从未见过支持这种说法的论据。是真是假?
- 还有其他我没有提到的事情需要考虑吗?
感谢您的想法
【问题讨论】:
-
静态或非静态方法没有内置的线程安全性,您必须自己提供所有这些。通常,代码不会被编写成完全线程安全的,因为这通常需要多于这里和那里的几个锁。换句话说,类和/或方法是否为静态与代码的线程安全无关。
-
msdn 明确表示公共静态成员是线程安全的。但这并不重要,因为我不使用任何静态成员..
-
您对问题的“未准备好生产”部分有引用或引用吗?我似乎从未见过这样的评论,并且有兴趣阅读其背后的推理。请注意,这不是我说那句话是错误的,我是说我没听说过,想知道更多。
-
好的,我的第一条评论是关于静态和非静态方法一般,一个类可能会记录所有静态方法都是线程安全的,但正如我的评论所说,他们将其内置到方法中,使它们成为静态与它无关。这是 Microsoft 的设计和实施选择。
-
@thread-safety:好的,很高兴知道。 @httplistener:是的,我也想了解更多。不幸的是,我不记得我在哪里读到这些 cmets。
标签: c# httplistener