C# OSX上的Mono HttpListener赢得';t释放端口

C# OSX上的Mono HttpListener赢得';t释放端口,c#,macos,mono,httplistener,C#,Macos,Mono,Httplistener,我在OSX上的Mono3.2上有一个简单的HttpListener listener = new HttpListener(); listener.Prefixes.Add(listenerUrlPrefix.FormatWith(emailGuid)); listener.Start(); ...do some stuff to listen if (listener != null) { listener.Prefixes.Clear(); listener.St

我在OSX上的Mono3.2上有一个简单的HttpListener

 listener = new HttpListener();
 listener.Prefixes.Add(listenerUrlPrefix.FormatWith(emailGuid));
 listener.Start();

...do some stuff to listen 

if (listener != null)
{
    listener.Prefixes.Clear();
    listener.Stop();
    listener.Close();
    listener = null;
}
但是,在执行上述代码之后,我仍然看到端口正在使用

COMMAND     PID          USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
mono-sgen 23718 administrator    8u  IPv4 0xe9923e6b20e4a19d      0t0  TCP localhost:palace-1 (LISTEN)

我编写的代码最终会希望启动一个新的HttpListener,我看到在某些实例或某些机器上(这是一个在许多机器上运行的应用程序),执行listener.Start()需要5-6秒。有什么想法吗?

这完全是猜测,但是你有没有试过处理这个物体?它的内部实现有可能在那里发布。对于这种类型的事情,我总是使用模式
using(listener=newhttplistener){/*/}
。这将在块的末尾自动触发instances
Dispose()
方法,确保正确清理。当然,值得一试,即使它不能解决问题,也值得更好的实践。如果我尝试调用Dispose(),我会在编译时得到“无法访问IDispose()的显式实现”。另外,我想说的是,dosomething逻辑非常分散,因此使用using块是不可行的。嗯,是的,我没有看到任何检查状态的简单方法。我的假设是关闭不会立即发生,因为其中一个异步调用尚未完成。但是我注意到,public
Close()
方法调用private
Close(bool-force)
方法,force为true,但前提是
disposed
bool仍然为false。你有没有试过简单地去掉挡块?它可能允许它强制
关闭
。如果没有,你可以尝试
Abort()
,而不是强制任何仍在等待结束的事情。哇,Octopoid,你一定会指引我正确的方向。是的,如果在mono实现中调用'Stop()'将'disposed'设置为true,这会使Close短路(true),这很奇怪。实际上,Close()方法似乎会等待GC。我已经对代码进行了分支,在mono上我将调用Abort(),它将在实际关闭时停止并关闭。初步结果是有希望的,但我将暂时不讨论这个问题。我还将了解如何提出拉取请求并帮助mono进行修复。mono团队提交的Bug: