0

我有一个 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;
    }
}

我希望程序在连接丢失后重新连接到服务器,但它却卡住了。

感谢任何帮助和提示如何解决该问题。

4

2 回答 2

3

只是为了让您知道我通过实施一种解决方法解决了这个问题:await request.GetResponseAsync()我没有在另一个线程中使用正常的 GetResponse() 方法,该方法到目前为止没有任何问题:await Task.Run(() => request.GetResponse())

于 2019-08-19T11:50:38.300 回答
0

使用FtpWebRequest.GetResponse代替FtpWebRequest.GetResponseAsync( asGetResponseAsync没有被覆盖FtpWebRequest并且来自基WebRequest类,它似乎无法处理某些特定的 FTP 用例)

如果您需要等待某些东西,只需替换它:

FtpWebRequest request = ...
var response = (FtpWebResponse) await request.GetResponseAsync();
return response;

接着就,随即:

var response = (FtpWebResponse) request.GetResponse();
return await Task.FromResult(response);
于 2021-09-15T13:34:33.900 回答