退出应用程序时(使用中)关闭使用的WinSCP会话

时间:2018-12-12 13:49:12

标签: c# .net multithreading winscp winscp-net

我有一个运行后台线程的应用程序,该线程打开一个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 :(得分:0)

您可以使用Session.Dispose方法杀死基础进程。

请参阅以下WinSCP文档:https://winscp.net/eng/docs/library_session_dispose

也请注意本文的文字:

  

如果打开了会话,则将其关闭,终止底层WinSCP进程,删除XML日志文件并处理对象。

     

与Session.Close相反,此后无法重用该对象。

答案 1 :(得分:0)

我已经将您的代码放入C#控制台应用程序中,并且在主线程和后台线程中都添加了Thread.Sleep。如果我运行该应用程序(在Windows 7和10上进行了测试),然后关闭它,或者即使我突然从任务管理器中将其杀死,WinSCP子进程也将消失。

这是预期的,因为子进程与.NET代码在同一Windows job中运行。因此,无论.NET代码做什么,它都是一个负责清理WinSCP子进程的操作系统。因此,您的应用程序中发生了一些奇怪的事情。


无论如何,如果要确保WinSCP会话中止,请在关闭应用程序时从主线程调用Session.Abort

答案 2 :(得分:-1)

在Form_FormClosing事件处理程序上的“我的解决方案”,只需输入以下几行:

            foreach (var process in Process.GetProcessesByName("WinSCP"))
            {
                process.Kill();
            }
            (Process.GetCurrentProcess()).Kill();