HttpListener处理请求异步(c#4)

时间:2013-11-05 02:24:58

标签: c#-4.0 httplistener

我有一个服务器使用HttpListener.Listen()监听请求,并使用CancellationTokenSource.Token支持取消。这是在c#4.0上。 调用代码:

Task.Factory.StartNew(() => 
{
    myServer = new MyServer();
    myServer.Listen(new[] { "http://*:8085/" }, cancel.Token);
});

MyServer的:

public void Listen(IEnumerable<string> prefixes, CancellationToken cancel)
{
  httpListener = new HttpListener();
  foreach(var p in prefixes) httpListener.Prefixes.Add(p);

  httpListener.Start();

  // watch for cancellation
  while(!cancel.IsCancellationRequested)
  {
    var result = httpListener.BeginGetContext(callback =>
      {
        var listener = (HttpListener)callback.AsyncState;
        if(!listener.IsListening) return;

        var httpContext = listener.EndGetContext(callback);
        // handle the request in httpContext, some requests can take some time to complete
      }, httpListener);

    while(result.IsCompleted == false)
    {
      if(cancel.IsCancellationRequested) break;
      Thread.Sleep(100); // sleep and recheck
    }
  }
  httpListener.Stop();
}

到目前为止它似乎运行良好,但它似乎是一段过长的代码。 我尝试使用FromAsync():

public void Listen(IEnumerable<string> prefixes, CancellationToken cancel)
{
  httpListener = new HttpListener();
  foreach(var p in prefixes) httpListener.Prefixes.Add(p);

  httpListener.Start();

  while(!cancel.IsCancellationRequested)
  {
    Task.Factory.FromAsync<HttpListenerContext>(httpListener.BeginGetContext, httpListener.EndGetContext, null).ContinueWith(t =>
    {
      var httpContext = t.Result;
      // do stuff
    }, cancel);
  }
  httpListener.Stop();
}

但是发生的事情是我会很快耗尽内存,因为很多任务都是在while循环中创建的。 有关如何解决此问题的任何建议?或者如何清理我的第一次尝试? 我在其他一些线程上看到了一些答案,但是那些使用.net 5.0,而我的项目是.net 4.0。

0 个答案:

没有答案