C# FTP错误:530抱歉,每个主机只允许5个连接

C# FTP错误:530抱歉,每个主机只允许5个连接,c#,ftp,C#,Ftp,我有一个FTP解决方案,效果很好。然而,过了一段时间,大概20-30分钟,我可以得到这个错误: 530抱歉,每个主机只允许5个连接 我在谷歌上搜索过这个问题,但没有找到任何解决办法。 我有不同的线程调用函数,但最多只允许每2秒调用一次函数。 我正在使用:使用语句,但我想我不想使用: request.KeepAlive=false仅每2秒调用一次的最大吞吐量并不能阻止外部线程调用5个以上的连接。想象一下,您与服务器的连接暂时非常慢,或者您请求的列表非常长。下载可能需要比平时更多的时间(比如说,出

我有一个FTP解决方案,效果很好。然而,过了一段时间,大概20-30分钟,我可以得到这个错误:
530抱歉,每个主机只允许5个连接

我在谷歌上搜索过这个问题,但没有找到任何解决办法。 我有不同的线程调用函数,但最多只允许每2秒调用一次函数。 我正在使用:使用语句,但我想我不想使用:


request.KeepAlive=false仅每2秒调用一次的最大吞吐量并不能阻止外部线程调用5个以上的连接。想象一下,您与服务器的连接暂时非常慢,或者您请求的列表非常长。下载可能需要比平时更多的时间(比如说,出于某种原因,需要15秒)。因为这将需要更多的时间来完成,您最终将达到5个并发连接的上限并得到错误,因为您将在以前的下载完成之前启动新的调用

您可以使用“排队”所有对方法的调用
FtpGetFiles
。这将确保线程执行的并发调用不会超过5个。当一个呼叫结束时,信号灯将释放一个点,另一个呼叫将开始

它看起来像这样:

public class TaskQueue
{
    private readonly SemaphoreSlim semaphore;
    private int pendingTasks;
    private int runningTasks;

    public TaskQueue(int maxConcurrencyLevel = 5)
    {
        semaphore = new SemaphoreSlim(maxConcurrencyLevel);
    }

    private async Task AddTask(Func<Task> task)
    {
        Interlocked.Increment(ref pendingTasks);
        await semaphore.WaitAsync();

        Interlocked.Decrement(ref pendingTasks);
        Interlocked.Increment(ref runningTasks);

        try
        {
            await task();
        }
        finally
        {
            Interlocked.Decrement(ref runningTasks);
            semaphore.Release();
        }
    }
}

我不认为这是客户端的问题。而是服务器错误地识别出客户端已经关闭了连接。无论如何,请确保启用日志记录并检查日志文件。或者更好地交叉检查客户端和服务器日志文件。另请参阅。问题是如果我完全关闭应用程序并直接打开它。然后,它可以立即从FTP服务器上传/获取文件/下载,因为它几乎感觉任何对象/连接都被以某种方式处理了。否则,我可以等待一个多小时,它不会连接到FTP。但一旦我关闭/打开应用程序,它就会直接工作。这是否提供了任何线索?我没有访问FTP服务器的权限,因为它是一个免费服务器,所以我无法检查这方面的任何内容。好的,至少发布客户端日志文件。是的,谢谢,我现在就这样做。我认为重现这个问题可能需要一些时间。
TaskQueue.AddTask(async () => await FtpGetFiles(host, folderpath, username, password));