Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ssh.net抛出操作会话已超时并被卡住_C#_.net_Ssh.net - Fatal编程技术网

C# ssh.net抛出操作会话已超时并被卡住

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 {

我创建了一个窗口服务,它使用SSH.net每600秒从sFTP服务器读取一次文件 在OnStart中,我创建了计时器

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())
{
//处理文件。
}

编辑代码后,服务可以连续运行,但问题不会再次出现,现在我仍在跟踪问题一段时间,以确保问题消失。