首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法访问已释放的对象。对象名:'System.Net.HttpListener‘

问无法访问已释放的对象。对象名:'System.Net.HttpListener‘
EN

Stack Overflow用户
提问于 2017-07-19 15:30:57
回答 1查看 4.6K关注 0票数 2

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

代码语言:javascript
复制
Cannot access a disposed object. Object name: 'System.Net.HttpListener'.

即使我使用某种机制通知StartListening()侦听已停止,在请求到达之前,它也不会像在HttpListenerContext context = await _listener.GetContextAsync();处停滞的相应线程上的执行一样运行。

代码语言:javascript
复制
  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 context的http监听器的适当方式。我使用的代码如下所示。谢谢。。

EN

回答 1

Stack Overflow用户

发布于 2017-07-19 17:06:34

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

代码语言:javascript
复制
   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);
      }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45183754

复制
相关文章

相似问题

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