首页 > 解决方案 > 即使在侦听器关闭后,C# HttpListener getContext 方法也会继续阻塞

问题描述

我正在使用 C# HttpListener(.Net Core 3.1,Windows)

根据以下文档,如果侦听器在等待时关闭,则 GetContext 方法预计会抛出 ObjectDisposedException。出于某种原因,即使在侦听器关闭后,方法调用仍保持阻塞状态。

代码示例来说明问题:

private static void Listen(HttpListener listener)
{
    var prefixes = new List<String> { "http://localhost:8080/" };
    prefixes.ForEach(s => listener.Prefixes.Add(s));
    listener.Start();
    Console.WriteLine("Listen: before GetContext");
    try
    {
        listener.GetContext();
    }
    catch (Exception)
    {
        Console.WriteLine("Listen: exception was thrown");
    }
    Console.WriteLine("Listen: end of function");
}


private static void Main(string[] args)
{
    var listener = new HttpListener();
    var listeningTask = Task.Run(() => Listen(listener));
    Task.Delay(1000).Wait();
    Console.WriteLine("Main: before stop");
    listener.Close();
    Console.WriteLine("Main: before listeningTask.Wait");
    listeningTask.Wait();
    Console.WriteLine("Main: done!");
}

预期输出:

Listen: before GetContext
Main: before stop
Main: before listeningTask.Wait
Listen: exception was thrown
Listen: end of function
Main: Done!

实际输出:

Listen: before GetContext
Main: before stop
Main: before listeningTask.Wait

标签: c#httplistener.net-core-3.1

解决方案


推荐阅读