线程为每次调用C#运行“步骤”

时间:2013-12-03 10:21:10

标签: c# multithreading

我的主要代码是从 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();上,我怀疑我也在做其他错误!

0 个答案:

没有答案