3

我有下面的多线程 FTP 进程。MaxThread 为 4,因为我们的目标客户端已将我们限制为 4 个线程。

ThreadPool.SetMaxThreads(workerThreads, completionPortThreads);

        foreach (var loan in fileList)
        {
            // Create an MRE for each thread.
            var handle = new ManualResetEvent(false);

            // Store it for use below.
            handles.Add(handle);
            ThreadPool.QueueUserWorkItem(FtpProcess, Tuple.Create(loan, handle));
        }
        // Wait for threads to finish.
        WaitHandle.WaitAll(handles.ToArray());

在 FtpProcess 方法中,连接被创建并且 QueueUserWorkItem 等待打开的线程继续。但连接不会发生。我收到一个会话超时错误。

private static void FtpProcess(object loanObject)
{
    var tuple = (Tuple<KeyValuePair<string, List<string>>, ManualResetEvent>)loanObject;
    var loan = tuple.Item1;
    var client = new SftpClient(removed for security but this is filled in);

    if (!client.IsConnected)
    {
       client.Connect();
    }

现在,如果我不使用 QueueUserWorkItem 而只使用 new Thread(FtpProcess).Start 那么它可以工作并连接多次,直到出现上限问题。

我是否遗漏了什么或完全误解了这个 .NET 进程的整个底层代码?

4

0 回答 0