C#|程序执行后程序不执行任何操作

时间:2011-10-10 19:06:19

标签: c# multithreading thread-safety arraylist

我的线程应该返回一个数组列表并将其放入文件中 我的问题是它停止了(至少我是这样看的) 的主题:

 ArrayList files = new ArrayList();
            Thread getF = new Thread(delegate()
            {
                files = GetFiles(path);
            });
            getF.Start();
            if (getF.ThreadState == ThreadState.Stopped)
            {
                MessageBox.Show(files.Count.ToString());
                foreach (string file in files)
                {
                    if (file != "")
                    {...

的GetFiles:

ArrayList results = new ArrayList();
            try
            {
             *loops**code*...
            results.Add(srl);//add file to arrFiles
            *end loops*

                MessageBox.Show("Complete");
                return results;
            }

程序只给我MessageBox.Show(“Complete”),然后什么都不做。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

        getF.Start();
        if (getF.ThreadState == ThreadState.Stopped)
        {
           //...
        }

if()语句永远不会执行。线程需要时间来完成它的工作。你必须插入getF.Join(),但这会破坏使用线程的重点。

使用BackgroundWorker类。

答案 1 :(得分:1)

AFAIK,Thread.Start()在线程启动后立即返回。因此,在检查ThreadState之前,您应该等待它完成工作。在This question

中讨论了等待线程完成的问题

答案 2 :(得分:1)

在执行条件之前,线程很可能不会完成。也就是说,你有:

getF.Start();
if (getF.ThreadState == ThreadState.Stopped)

在测试之前,线程可能不会启动以查看它是否已停止。你必须有一些方法让主线程知道另一个完成了它的工作。

等待线程完成的典型方法是调用Join。那就是:

getf.Start();
getf.Join(); // suspends main thread until the child thread is done

但如果你这样做,就会阻止你的用户界面。

使用多个线程的原因是主线程(在你的情况下是UI线程)可以做其他事情,而其他线程正在做他们的工作。我怀疑你想要的是一个BackgroundWorker来获取文件,然后在完成之后执行一些操作 - 在RunWorkerCompleted事件处理程序中。