.net – 处理Microsoft.Owin.Hosting.WebApp会抛出’System.Obje
我们的
WPF应用程序中有一个自托管的SignalR服务器. WebApp在应用程序启动时启动.在应用程序退出时,我们处理WebApp.
public void Start() { myWebApp = WebApp.Start<MyApp>(url); } private void Dispose(bool isDisposing) { if (disposed) return; if (isDisposing) myWebApp.Dispose(); disposed = true; } 对myWebApp.Dispose()的调用引发了’System.ObjectDisposedException’. 更新:事实证明这是我在visual studio中可以看到的第一个机会异常,因为设置“破坏clr异常”是活动的.这个异常似乎是在内部处理的,并没有冒出我们的代码
在探索了Katana源代码之后,我发现了这个问题的原因.它是Microsoft.Owin.Host.HttpListener.OwinHttpListener.ProcessRequestsAsync()方法.它启动while循环,包含在try-catch部分中的私有HttpListener实例的_listener.GetContextAsync()调用.
类也实现了IDisposable并包含Dispose()方法.此方法处理私有HttpListener实例. 当你调用WebApp.Start()时,它返回一个IDisposable实例,它只有Dispose()方法,它处理OwinHttpListener. 因此,当你处理它时,你调用它的OwinHttpListener的Dispose()方法,它处理私有的HttpListener. 但同时ProcessRequestsAsync()调用_listener.GetContextAsync(),但_listener已经处理并抛出ObjectDisposedException. catch块记录异常并从ProcessRequestsAsync()返回. 我认为,ProcessRequestsAsync()中的双重检查锁可能是一个不错的选择. private async void ProcessRequestsAsync() { while (_listener.IsListening && CanAcceptMoreRequests) { Interlocked.Increment(ref _currentOutstandingAccepts); HttpListenerContext context; try { context = await _listener.GetContextAsync(); } (SOME_OTHER_CATCHES) catch (ObjectDisposedException ode) { // These happen if HttpListener has been disposed Interlocked.Decrement(ref _currentOutstandingAccepts); LogHelper.LogException(_logger,"Accept",ode); return; } (SOME_OTHER_CODE) } } public void Dispose() { if (_listener.IsListening) { _listener.Stop(); } ((IDisposable)_listener).Dispose(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows-phone-7 – 如何禁用Windows Phone 7中列表框项目中
- windows – 如何理解获取和释放语义?
- windows – 关于日期格式的简单问题
- 用于Windows Phone 7 / Silverlight的绘图库
- windows-server-2003 – 必须拥有Windows服务器的应用程序
- 如何在Windows操作系统的python中给出PID的运行过程?
- windows-server-2008 – 你在Windows Server上使用什么RAM磁
- Windows 10(UWP)中的TimeTrigger/Scheduler不到15分钟
- windows-server-2008 – 在没有SmartStart的HP Proliant服务
- 使用Interop.SHDocVw.dll在哪里可以找到这个命名空间/ dll?
- windows-phone-7 – 适用于Windows Mobile 6.5和
- windows – 是否可以运行无人值守的chkdsk?
- 如何关闭Win10/Win8.1/Win7管理共享
- 如何将程序输出管道输出到屏幕和Windows下的文件
- .net – 为什么暴露的类型必须为WinMD / WinRT组
- 在Windows Azure虚拟机VM上安装FTP应用程序FileZ
- 如何在Windows中安装php_posix php扩展?
- dynamic-crm – 您的Microsoft Dynamics CRM经验
- windows-8 – 如何通过CLI或AHK在Windows 8中打开
- 使用Microsoft Git Provider时,为什么我无法在Vi