C# Метод getContext HttpListener продолжает блокировать даже после закрытия слушателя - PullRequest
0 голосов
/ 08 марта 2020

Я работаю с 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
...