我的主要代码是从 MainWindow.xaml.cs 执行的,还有一个名为 testThread 的线程。
我需要testThread来读取MainWindow决定的文件夹(也包含子文件夹)并且每次读取一个文件,每次MainWindow都需要它。我知道使用一个线程对这个例子来说是没用的,但是我需要在更大的上下文中实现这个机制。
实现这一目标的最佳方法是什么?我的想法是使用信号量并在每个文件读取后锁定线程,这样我每次需要下一个文件时都可以解锁它。这是我试图实现的(并且不起作用):
MainWindow.cs
public static string myRootDir;
private void Button_test_Click(object sender, RoutedEventArgs e)
{
try
{
myRootDir = @"C:\";
testThread myThread = new testThread();
Thread workerThread = new Thread(myThread.start);
workerThread.Start();
//for this test i'm getting the first 10 files
for (int c1 = 1; c1 < 10; c1++ )
{
result.Text += myThread.getNext();
//this is just a test, so i wait 1 second from each request
Thread.Sleep(1000);
}
}
catch (Exception error)
{
result.Text = error.Message;
}
}
testThread.cs
public class testThread
{
private string rootDir = "";
public static string currentFilePath = "";
Semaphore mySemaphore = new Semaphore(0, 2);
public void start()
{
rootDir = MainWindow.myRootDir;
startReading(rootDir);
}
public string getNext()
{
mySemaphore.Release();
return currentFilePath;
}
private void startReading(string root)
{
//read all the files in current dir
foreach (string singleFilePath in Directory.GetFiles(root, "*.*"))
{
currentFilePath = singleFilePath;
mySemaphore.WaitOne();
}
//repeat for all subfolders
foreach (string singleDirPath in Directory.GetDirectories(root))
{
startReading(singleDirPath);
}
}
}
从调试我可以看到代码没有停在mySemaphore.WaitOne();
上,我怀疑我也在做其他错误!