Закрыть используемый сеанс WinSCP при выходе из приложения (во время использования) - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть приложение, которое запускает фоновый поток, который открывает сеанс WinSCP, который используется для выполнения каких-либо задач, например:

new Thread(() => {

    //do stuff
    SessionOptions options = new SessionOptions
    {
        //options
    };

    using(Session session = new Session())
    {
        bool success = false;
        foreach (var ip in IPs)
        {
            options.HostName = ip.Value;
            try
            {
                session.Open(options);
                success = true;
                break;
            }
            catch (Exception)
            {

            }
        }
        if(success)
        {
            CommandExecutionResult result = session.ExecuteCommand(*some command*);
            result.Check();
            someVariable = result.Output;
        }
    }

    //do stuff
})
{
    IsBackground = true
}.Start();

Теперь я заметил, что если я закрою приложение, находясь в usingпоток действительно останавливается, но сеанс WinSCP остается открытым (может быть, потому что поток прерывается?), и если я повторяю процесс, я, конечно же, получаю больше сеансов WinSCP.Как закрыть определенный сеанс, который я открываю в приложении?

Отредактировано: добавлено больше того, что происходит в блоке using.

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Я поместил ваш код в консольное приложение C # и добавил Thread.Sleep в основной и фоновый поток.Если я запускаю приложение (проверено на Windows 7 и 10) и закрываю его, или даже если я внезапно убиваю его из диспетчера задач, подпроцесс WinSCP полностью исчезает.

Это ожидалось, так как подпроцесс работаетв том же задании Windows , что и код .NET.Так что это операционная система, которая заботится об очистке подпроцесса WinSCP, независимо от того, что делает код .NET.Так что в вашем приложении происходит что-то странное.


В любом случае, если вы хотите убедиться, что сеанс WinSCP прерван, просто вызовите Session.Abort из основного потока, когдаВы закрываете приложение.

0 голосов
/ 24 апреля 2019

Мое решение, в обработчике событий Form_FormClosing просто поместите эти строки:

            foreach (var process in Process.GetProcessesByName("WinSCP"))
            {
                process.Kill();
            }
            (Process.GetCurrentProcess()).Kill();
0 голосов
/ 12 декабря 2018

Вы можете использовать метод Session.Dispose, который убивает базовый процесс.

См. Эту документацию WinSCP: https://winscp.net/eng/docs/library_session_dispose

Также обратите внимание на текст из этой статьи:

Если сеанс был открыт, закрыл его, завершил базовый процесс WinSCP, удалил файл журнала XML и удалил объект.

В отличие от Session.Close, впоследствии невозможно повторно использовать объект.

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