2011-10-10 64 views
2

我的线程应该返回一个数组列表并将其放入文件中。
我的问题是,它只是停止(至少这是我的看法)。
主题:C#|程序在执行后不执行任何操作

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( “完成”),然后什么也不做。 在此先感谢。

+2

你遗漏了你的例子中最重要的部分 - 循环内部是什么? –

+0

对于初学者来说,你需要(1)在启动'getF'后确保线程实际完成之前,需要(1)某种等待/循环结构,然后再尝试用'ArrayList'做一些事情,和/或(2) on'files'来防止你的代码试图同时读写它。 – David

回答

1

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

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

如果()语句永远不会执行。线程需要时间才能完成工作。你将不得不插入getF.Join(),但这会破坏使用线程的要点。

使用BackgroundWorker类。

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事件处理程序中。

+0

首先,我不会使用它,因为这是我创建线程的原因。其次,如何在使用backGroundWorker时以相同的方式返回文件数组(我想要一个返回语句和一个ArrayList在主方法中检索它)。 – funerr

+0

@ agam360:'BackgroundWorker'链接有一个很好的例子来说明如何使用它。如果你想要一个'ArrayList',将其声明为一个类作用域引用并将其填充到'BackgroundWorker'中。 –

+0

这也不好。因为我将使用另一种递归获取这些数据的方法,因此我需要该数组列表处于类范围内。 – funerr