我有下面的多线程 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 进程的整个底层代码?