如何设置threadCounter变量的动态数量
本文关键字:变量 动态 threadCounter 何设置 设置 | 更新日期: 2023-09-27 18:03:37
我不是真的进入多线程,所以可能这个问题是愚蠢的,但似乎我找不到解决这个问题的方法(特别是因为我正在使用c#,我已经使用它一个月了)。
我有一个动态数量的目录(我从数据库中的查询中得到了它)。在这些查询中有一定数量的文件。
对于每个目录,我需要使用一种方法以并发方式使用FTP传输这些文件,因为我基本上没有限制FTP最大连接数(不是我的词,它写在细节中)。
但是我仍然需要控制每个目录传输的最大文件量。所以我需要计算我正在传输的文件(递增/递减)。
我怎么能做到呢?我应该使用类似数组的东西并使用Monitor类吗?
编辑:Framework 3.5
您可以使用Semaphore
类来限制每个目录的并发文件数量。您可能希望每个目录有一个信号量,以便每个目录的FTP上传数量可以独立控制。
public class Example
{
public void ProcessAllFilesAsync()
{
var semaphores = new Dictionary<string, Semaphore>();
foreach (string filePath in GetFiles())
{
string filePathCapture = filePath; // Needed to perform the closure correctly.
string directoryPath = Path.GetDirectoryName(filePath);
if (!semaphores.ContainsKey(directoryPath))
{
int allowed = NUM_OF_CONCURRENT_OPERATIONS;
semaphores.Add(directoryPath, new Semaphore(allowed, allowed));
}
var semaphore = semaphores[directoryPath];
ThreadPool.QueueUserWorkItem(
(state) =>
{
semaphore.WaitOne();
try
{
DoFtpOperation(filePathCapture);
}
finally
{
semaphore.Release();
}
}, null);
}
}
}
var allDirectories = db.GetAllDirectories();
foreach(var directoryPath in allDirectories)
{
DirectoryInfo directories = new DirectoryInfo(directoryPath);
//Loop through every file in that Directory
foreach(var fileInDir in directories.GetFiles()) {
//Check if we have reached our max limit
if (numberFTPConnections == MAXFTPCONNECTIONS){
Thread.Sleep(1000);
}
//code to copy to FTP
//This can be Aync, when then transfer is completed
//decrement the numberFTPConnections so then next file can be transfered.
}
}
您可以按照上面的行尝试一些东西。注意,这只是基本的逻辑,可能还有更好的方法。