我有一个C#程序,它每隔x秒检查一次ftp目录中的新文件。如果找到新文件,则下载该文件。这很好用。如果我在未运行ftp服务器的情况下启动程序,程序将循环并返回一条消息,指出无法访问服务器。然后我启动服务器,程序就可以正常连接了。但是如果我再次退出ftp服务器,我的程序就会卡在FtpWebResponse中。
我在try catch块中有一个using语句块来关闭所有连接。
while (true)
{
//...
FtpFileList = null;
while (FtpFileList == null)
{
FtpFileList = await GetFtpFileList(adress, user, password);
await Task.Delay(3000);
}
await Task.Delay(27000);
//...
}
public static async Task<List<string>> GetFtpFileList(string address, string user, string password)
{
try
{
List<string> returnValue = new List<string>();
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(address);
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential(user, password);
using (FtpWebResponse response = (FtpWebResponse)await request.GetResponseAsync()) //The program gets stuck here
{
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
while (reader.Peek() >= 0)
{
returnValue.Add(reader.ReadLine());
}
}
AddToLogFile(DateTime.Now + ": " + "FTP directory updated");
return returnValue;
}
catch (WebException e)
{
AddToLogFile(DateTime.Now + ": " + e.Message);
return null;
}
}我希望程序在连接丢失后重新连接到服务器,但它却卡住了。
任何关于如何解决这个问题的帮助和提示都是值得感谢的。
发布于 2019-08-19 19:50:38
为了让您知道,我通过实现一个变通方法解决了这个问题:我在另一个线程中使用普通的GetResponse()方法,而不是使用await request.GetResponseAsync(),到目前为止,这个线程没有出现任何问题:await Task.Run(() => request.GetResponse())
发布于 2021-09-15 13:34:34
使用FtpWebRequest.GetResponse而不是FtpWebRequest.GetResponseAsync (因为GetResponseAsync在FtpWebRequest中没有被覆盖,它来自基本的WebRequest类,在那里它似乎不能处理一些特定的FTP用例)
如果您需要等待,只需替换以下内容:
FtpWebRequest request = ...
var response = (FtpWebResponse) await request.GetResponseAsync();
return response;在此基础上:
var response = (FtpWebResponse) request.GetResponse();
return await Task.FromResult(response);https://stackoverflow.com/questions/57307761
复制相似问题