首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpListener异步上下文泄漏

HttpListener异步上下文泄漏
EN

Stack Overflow用户
提问于 2015-10-08 17:26:40
回答 1查看 1K关注 0票数 1

我有一个使用System.Net.HttpListener的简单HTTPServer实现。似乎我的AsyncCallbacks没有被分解,因此导致了泄漏。

代码语言:javascript
复制
public abstract class HttpServer : IHttpServer, IDisposable
{
    protected readonly HttpListener HttpListener = new HttpListener();

    protected HttpServer(IEnumerable<string> prefixes)
    {
        WaitOnStartup = new AutoResetEvent(false);
        foreach (var prefix in prefixes)
        {
            HttpListener.Prefixes.Add(prefix);
        }
    }

    private void Process()
    {
        var result = HttpListener.BeginGetContext(ContextReceived, HttpListener);
        result.AsyncWaitHandle.WaitOne(30000);
        result.AsyncWaitHandle.Dispose();
    }

    protected abstract void ContextReceived(IAsyncResult ar);

    [...]
}

public class MyHttpServer : HttpServer
{
    public MyHttpServer(IEnumerable<string> prefixes) : base(prefixes) { }

    protected override void ContextReceived(IAsyncResult ar)
    {
        var listener = ar.AsyncState as HttpListener;
        if (listener == null) return;
        var context = listener.EndGetContext(ar);
        try
        {
            var request = context.Request;
            var response = context.Response;

            //handle the request...
        }
        finally
        {
            context.Response.Close();
            listener.Close();
        }
    }
}

如果我运行一个内存分析器,它看起来异步句柄(BeginGetContext)没有被释放,这意味着AsyncCallback对象不断增加……

我错过了什么?

更新11:45:

下面是基类(HttpServer)的Dipose()

代码语言:javascript
复制
protected virtual void Dispose(bool disposing)
{
    if (_disposed)
        return;

    if (disposing)
    {
        // Free any other managed objects here. 
        HttpListener.Stop();
        HttpListener.Close();
        WaitOnStartup.Dispose();
    }

    // Free any unmanaged objects here. 
    //
    _disposed = true;
}
EN

回答 1

Stack Overflow用户

发布于 2015-10-08 20:39:55

看起来我设法找到了问题所在,我不是很确定为什么会这样。

但从@csharptest.net在Multi-threading with .Net HttpListener中发布的答案中获得灵感,我取代了以下使用:

代码语言:javascript
复制
private void Process()
{
    var result = HttpListener.BeginGetContext(ContextReceived, HttpListener);
    result.AsyncWaitHandle.WaitOne(30000);
    result.AsyncWaitHandle.Dispose();
}

使用

代码语言:javascript
复制
private void Process()
{
    while (HttpListener.IsListening)
    {
        var result = HttpListener.BeginGetContext(ContextReceived,     HttpListener);
        if (WaitHandle.WaitAny(new[] { result.AsyncWaitHandle, _shutdown })     == 0)
            return;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33011725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档