c# - 异步 FTP 调用永远不会结束

标签 c# async-await c#-5.0

我正在尝试查找所有在给定 IP 组上接受匿名连接的 ftp 服务器。

基本上,我获取要检查的 IP,然后在每个 IP 上尝试 ListDirectory。如果我没有异常(exception),ftp 存在并且可以访问。

我使用异步方法来验证 IP,这使得事情变得更快。但是,我需要等待所有异步调用返回。为此,我对异步调用的数量保留了一个计数器,问题是该计数器永远不会达到 0。

我的代码如下所示:

迭代 IP:

static int waitingOn;
public static IEnumerable<Uri> GetFtps()
{
    var result = new LinkedList<Uri>();
    waitingOn = 0;

    IPNetwork ipn = IPNetwork.Parse("192.168.72.0/21");
    IPAddressCollection ips = IPNetwork.ListIPAddress(ipn);

    foreach( var ip in ips )
    {
        VerifyFtpAsync(ip, result);
    }

    while (waitingOn > 0)
    {
        Console.WriteLine(waitingOn);
        System.Threading.Thread.Sleep(1000);
    }

    return result;
}

并验证每个 IP:

public async static void VerifyFtpAsync( IPAddress ip, LinkedList<Uri> ftps )
{
    ++waitingOn;
    try
    {
        Uri serverUri = new Uri("ftp://" + ip);
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
        request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        request.Timeout = 10000;
        request.Credentials = new NetworkCredential("anonymous", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="087a676165487b6d697a6b60266b6765" rel="noreferrer noopener nofollow">[email protected]</a>");

        FtpWebResponse response = (FtpWebResponse) await request.GetResponseAsync();

        // If we got this far, YAY!
        ftps.AddLast(serverUri);
    }
    catch (WebException)
    {
    }
    --waitingOn;
}

最佳答案

替换

FtpWebResponse response = (FtpWebResponse) await request.GetResponseAsync(); 

带有同步代码

FtpWebResponse response = (FtpWebResponse) request.GetResponse();

FtpWebRequest.GetResponseAsync 不会针对特定于 FTP 进行重写,并且来自基本 WebRequest 类,该类似乎无法正确处理此问题。

关于c# - 异步 FTP 调用永远不会结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15456771/

相关文章:

c# - 当我重新启动我的模拟器时,我无法在 sqlite Windows Phone 8.1 中检索数据库值

c# - RegularExpressionValidator 正则表达式用于验证多行文本框中的 IP(每行一个)?

c# - Azure Web 角色访问外部 Web 服务时遇到问题

javascript - Pg-promise - 可能参与事务/任务的可重用查询

json - ServiceStack - 在映射到 DTO 之前验证 json 数据

c# - 在运行时解析成员名称

c# - 编译器无法从包装的通用 IEnumerable 推断类型

c# - 在 void 方法中使用异步等待

c# - 从不同线程读取和写入相同的内存

c# - async/await 是否适契约(Contract)时受 IO 和 CPU 限制的方法?