C# 无法访问已释放的对象。对象名称:';System.Net.HttpListener';

C# 无法访问已释放的对象。对象名称:';System.Net.HttpListener';,c#,.net,asynchronous,httplistener,C#,.net,Asynchronous,Httplistener,我正在创建一个侦听特定Http请求的windows服务。我正在一个单独的任务中运行一个httpListener。当服务停止时,我关闭侦听器实例。但是http listenerContext似乎正在等待传入的请求,当侦听器关闭时,我得到以下错误 Cannot access a disposed object. Object name: 'System.Net.HttpListener'. 即使我使用某种机制通知StartListening()侦听已停止,它也不会运行,因为相应线程上的执行卡在Ht

我正在创建一个侦听特定Http请求的windows服务。我正在一个单独的任务中运行一个
httpListener
。当服务停止时,我关闭侦听器实例。但是http listenerContext似乎正在等待传入的请求,当侦听器关闭时,我得到以下错误

Cannot access a disposed object. Object name: 'System.Net.HttpListener'.
即使我使用某种机制通知
StartListening()
侦听已停止,它也不会运行,因为相应线程上的执行卡在
HttpListenerContext=wait_listener.GetContextAsync()上直到请求到达

  public void StartListening() {
         _listener.Start();
         _logger.LogDebug("Http Listening started");

         Task.Run(async () => {
            while (true) {
               try {
                 if (isOpen == false) {
                 return 0;
                   }
                  HttpListenerContext context = await _listener.GetContextAsync();
                  HttpListenerRequest request = context.Request;

                  //processing of the requests url/////
                  var newUri = request.Url.AbsoluteUri;
                  _concurrentUrlQueue.Enqueue(newUri);
                  if (ConcurentUrlQueueChanged != null) ConcurentUrlQueueChanged(this, new EventArgs());
               }
               catch (Exception e) {
                  _logger.LogError("Error at get listening  context, Message: " + e.Message);
               }

            }
         });

      }    
      public void StopListening() {
          isOpen = false;
         _logger.LogDebug("Http Listening Stop");
         _listener.Close();

      }
这是关闭正在侦听get上下文的http侦听器的适当方法。我使用的代码如下。
谢谢..

我找到了解决办法。据我所知,
listener.GetContextAsync()
是一种阻塞方法,只有在检测到新上下文时,我的代码才会继续执行。我可以使用非阻塞版本BeginGetContext()和EndGetContext()。当我想停止执行时,我使用取消令牌

   public void StartListening() {

         _listener.Start();
         _logger.LogDebug("Http Listening started");

         Task.Run(() => {
            while(true) {

               if(_cancellationToken.IsCancellationRequested) return ;

               try {
                  NonblockingListener();
               }
               catch (Exception e) {
                  _logger.LogError("Error With the listening Proccess, Message : "+e.Message);
               }

            }
         },_cancellationToken);
      }


      public void StopListening() {

         _cancellationTokenSource.Cancel();
         ListenerCallback(null);

         _logger.LogDebug("Http Listening Stop");
         _listener.Close();
      }


      public void NonblockingListener() {
         IAsyncResult result = _listener.BeginGetContext(ListenerCallback, _listener);
         result.AsyncWaitHandle.WaitOne();
      }


      public void ListenerCallback(IAsyncResult result) {

       if(_cancellationToken.IsCancellationRequested)return;

         _listener = (HttpListener)result.AsyncState;


         HttpListenerContext context = _listener.EndGetContext(result);
         HttpListenerRequest request = context.Request;

         //processing code
         EnqueUrl(request);
      }

看看这个问题谢谢@Ben,我还没有看过这篇文章,它提到要使用
BeginGetContext()
EndGetContext()
,就像我在下面的回答中所做的那样,令人惊讶的是,我通过在管理模式下运行IDE解决了这个问题。我讨厌Windows这是一个很好的答案,非常有帮助。但我对你例子中的两件事感到困惑。什么是_cancellationTokenSource.Cancel();为什么要调用ListenerCallback(null);。调用ListenerCallback(null)看起来像是请求null引用异常。否?因此,示例应包括:私有CancellationTokenSource\u CancellationTokenSource;私有取消令牌\u取消令牌;并且在StartListening()中_cancellationTokenSource=new cancellationTokenSource()_cancellationToken=\u cancellationTokenSource.Token;但是我仍然不明白调用ListenerCallback(null)的目的;