C# ssh.net抛出操作会话已超时并被卡住
我创建了一个窗口服务,它使用SSH.net每600秒从sFTP服务器读取一次文件 在OnStart中,我创建了计时器C# ssh.net抛出操作会话已超时并被卡住,c#,.net,ssh.net,C#,.net,Ssh.net,我创建了一个窗口服务,它使用SSH.net每600秒从sFTP服务器读取一次文件 在OnStart中,我创建了计时器 timer = new Timer(TimerCallback, null, 0, timeDelay); TimerCallBack是使用SSH.net的函数。在读取文件之前的连接中,我有代码连接到sFTP服务器,如下所示 var FILE_READ_FLAG = false; try {
timer = new Timer(TimerCallback, null, 0, timeDelay);
TimerCallBack是使用SSH.net的函数。在读取文件之前的连接中,我有代码连接到sFTP服务器,如下所示
var FILE_READ_FLAG = false;
try
{
req = new SftpClient(ftpHost, ftpLogin, ftpLoginPassword);
req.Connect();
if (req.IsConnected)
{
directories = req.ListDirectory(ftpPath);
FILE_READ_FLAG = true;
}
}
catch (Exception e)
{
EventLog.WriteEntry(sSource,"ERROR : " + GetFullMessageFromException(e),
EventLogEntryType.Information, 234);
FILE_READ_FLAG = false;
}
if (FILE_READ_FLAG){
// read file and insert to database
}
问题是,当服务运行并发生异常时,服务可以每600秒再次运行一次,但会出现错误
Session operation has timed out
at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle, TimeSpan timeout)
at Renci.SshNet.Session.WaitOnHandle(WaitHandle waitHandle)
at Renci.SshNet.Session.Connect()
at Renci.SshNet.BaseClient.Connect()
当我尝试停止并重新启动服务时,该服务无法再次运行,并且似乎卡住了。Windows show警报消息无法及时停止,我必须通过cmd终止服务并手动启动它
我的问题是,为什么另一个异常可以用try/catch块处理,但有了这个错误,服务就不能用计时器再次运行,我丢失了什么,或者使用了错误的计时器?谢谢您已经创建了一个对象SftpClient。查看代码,它没有得到正确的处理,而且您也没有调用disconnect。如果出现错误,系统可能会挂起,因为存在打开的连接 但是,您可以将客户端设置为变量(即
req=new SftpClient(ftpHost、ftpLogin、ftpLogin password
),因此可能会在其他地方调用disconnect/disposed。尽管我仍然建议重新构造代码,以便您从SFTP客户端获取数据,并立即断开连接/处置。最好将连接打开的时间减到最少
考虑以下几点:
List<SftpFile> files = null;
using (SftpClient sftp = new SftpClient(host, username, password)) // using will dispose SftpClient
{
try
{
sftp.Connect();
files = sftp.ListDirectory(ftpPath).ToList();
sftp.Disconnect();
}
catch (Exception e)
{
EventLog.WriteEntry(sSource,"ERROR : " + GetFullMessageFromException(e),
EventLogEntryType.Information, 234);
}
}
if(files.any())
{
// Process the files.
}
列表文件=null;
使用(SftpClient sftp=new SftpClient(主机、用户名、密码))//使用将处理SftpClient
{
尝试
{
连接();
files=sftp.ListDirectory(ftpPath.ToList();
sftp.Disconnect();
}
捕获(例外e)
{
EventLog.WriteEntry(sSource,“ERROR:+GetFullMessageFromException(e)),
EventLogEntryType.Information,234);
}
}
if(files.any())
{
//处理文件。
}
编辑代码后,服务可以连续运行,但问题不会再次出现,现在我仍在跟踪问题一段时间,以确保问题消失。