如何做到两个线程不能访问同一个文件夹
本文关键字:不能 线程 访问 同一个 文件夹 两个 何做 | 更新日期: 2023-09-27 18:20:39
我正在编写一个多线程应用程序,它是windows服务。我有20个文件夹。我在启动方法上创建了15个线程。我想实现这一目标;15个线程转到文件夹1,2,3,。。。,15。当一个线程完成时,它会创建另一个线程。这个创建的线程必须转到第16个文件夹。它不能进入工作文件夹。我该怎么做?也就是说,我如何才能确保两个线程不在同一个文件夹中?
您是否可以只使用一个静态变量作为文件夹名称的计数器?
类似于:
private static int _folderNameCounter = 0;
private static readonly object _padlock = new object();
public static int GetFolderCounter()
{
lock(_padlock)
{
_folderNameCounter++;
return _folderNameCounter;
}
}
public static void Main()
{
for(int i = 0; i < 20; i++)
{
Task.Factory.StartNew(() =>
{
var path = @"c:'temp'" + GetFolderCounter();
Directory.CreateDirectory(path);
// add your own code for the thread here
});
}
}
注意:我使用了TPL,而不是直接使用Threads,因为我认为TPL是一个更好的解决方案。当然,您可能有特定的要求,这可能意味着Threads是你的案子。
使用BlockingCollection<T>
并用文件夹编号填充集合。每个任务处理集合中的一个项目,而集合本身处理多线程方面,因此每个项目只由一个使用者处理。
// Define the blocking collection with a maximum size of 15.
const int maxSize = 15;
var data = new BlockingCollection<int>(maxSize);
// Add the data to the collection.
// Do this in a separate task since BlockingCollection<T>.Add()
// blocks when the specified capacity is reached.
var addingTask = new Task(() => {
for (int i = 1; i <= 20; i++) {
data.Add(i);
}
).Start();
// Define a signal-to-stop bool
var stop = false;
// Create 15 handle tasks.
// You can change this to threads if necessary, but the general idea is that
// each consumer continues to consume until the stop-boolean is set.
// The Take method returns only when an item is/becomes available.
for (int t = 0; t < maxSize; t++) {
new Task(() => {
while (!stop) {
int item = data.Take();
// Note: the Take method will block until an item comes available.
HandleThisItem(item);
}
}).Start();
};
// Wait until you need to stop. When you do, set stop true
stop = true;