Как правильно утилизировать HttpListener на Process.Exited? - PullRequest
0 голосов
/ 03 мая 2019

У меня есть приложение, которое выполняет запросы к определенному URL через определенные промежутки времени на протяжении всего его выполнения.В целях тестирования я хочу настроить фиктивный сервер с HttpListener для получения этих запросов и делать что-то каждый раз, когда он получает один.

Когда процесс завершается, я хочу отключить HttpListener вправильный путь.

Вот что у меня есть:

protected async Task<bool> RunApp()
{
    try
    {
        var startInfo = new ProcessStartInfo
        {
            FileName = "/some/dir/helloworld.sh",
            UseShellExecute = true  
        };

        using (var proc = new Process())
        {
            proc.StartInfo = startInfo;
            proc.Exited += ShutdownServer;
            proc.EnableRaisingEvents = true;
            proc.Start();

            while (!proc.HasExited)
            {
                var context = await server.GetContextAsync();
                await ProcessCallback(context);   
            }
        }

        // at this point, the process should be disposed as well
        // as the HttpListener to continue with other code execution
        return true; 
    } 
    catch(Exception ex)
    {
        //Log it
    }
}

private void ShutdownServer(object sender, EventArgs args)
{
    server.Stop();
    server.Close();
}

private async Task ProcessCallback(HttpListenerContext context)
{
    // do some stuff
}

Но когда процесс завершается, я получаю следующее исключение:

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'listener'.
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Net.ListenerAsyncResult.GetContext()
   at System.Net.HttpListener.EndGetContext(IAsyncResult asyncResult)
   at System.Net.HttpListener.<>c.<GetContextAsync>b__44_1(IAsyncResult iar)

Что происходит из:

var context = await server.GetContextAsync();

В этой ситуации используется CancellationToken?Если нет, то как правильно отключить HttpListener?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...