C # chỉ nhận được X số tệp
Tôi chỉ muốn xử lý X số lượng tệp tại một thời điểm cho vòng lặp vô hạn bên dưới. Các mã dưới đây cung cấp cho tôi tất cả các tệp cùng một lúc, làm thế nào để chỉ nhận được số tệp X?
while (true)
{
var files = new DirectoryInfo(@"path")
.GetFiles()
.OrderBy(p => p.LastWriteTimeUtc)
.ToList();
foreach (var f in files)
{
//do some processing
Console.WriteLine(f.Name);
f.Delete();
}
Thread.Sleep(5000);
}
Trả lời
Bạn có thể sử dụng kết hợp để xử lý các tệp của bạn theo lôSkip() .Take(X)
Skip (): Bỏ qua một số phần tử được chỉ định trong một chuỗi và sau đó trả về các phần tử còn lại.
Take (): Trả về một số phần tử liền kề được chỉ định từ đầu một chuỗi.
Xử lý tệp theo lô,
var batchSize = 10; //Decide batch size I considered 10 files in a batch
var skipBatch = 0 //Skip count
while (true)
{
var files = new DirectoryInfo(@"path").GetFiles()
.OrderBy(p => p.LastWriteTimeUtc).ToList(); //store all files
var skipIntervals = skipBatch * batchSize;
//Exit condition from infinity loop
if(skipIntervals > files.Length)
break;
var filesInBatch = files.Skip(skipIntervals).Take(batchSize);
foreach (var f in filesInBatch)
{
//do some processing
Console.WriteLine(f.Name);
f.Delete();
}
Thread.Sleep(5000);
skipBatch++; //Increment skipBatch count by 1 as this batch is processed
}
while (true)
{
var files = new DirectoryInfo(@"path").GetFiles()
.OrderBy(p => p.LastWriteTimeUtc).ToList();
foreach (var f in files)
{
Thread.Sleep(5000);//should be up here
//do some processing
Console.WriteLine(f.Name);
f.Delete();
}
}
Phương thức thread.sleep không ở đúng nơi
bạn luôn có thể sử dụng Await Task.Delay () tốt hơn nhiều so với thread.sleep vì nó làm cho toàn bộ chương trình bị đóng băng tùy thuộc vào những gì bạn đang làm với nó
Chỉ cần giữ một quầy. Mỗi lần bạn xử lý một tệp, hãy tăng nó lên một tệp. Khi nó đạt đến giới hạn, bạn đã kết thúc lô.
while (true)
{
var counter = 0;
var files = new DirectoryInfo(@"path").GetFiles()
.OrderBy(p => p.LastWriteTimeUtc).ToList();
foreach (var f in files)
{
//do some processing
Console.WriteLine(f.Name);
f.Delete();
counter++;
if (counter >= batchSize)
{
Thread.Sleep(timeBetweenBatches);
counter = 0;
}
}
Thread.Sleep(5000);
}