我有一个运行后台线程的应用程序,该线程打开一个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
块中添加了更多内容。
答案 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();