public void DownLoadStart() //启动下载主程序
{
string WebUrl=""; 
int ItemUrlLabel=-1; 
Monitor.Enter(ArrUrlLabel);
Monitor.Enter(ArrUrl);
Monitor.Enter(ArrDir);
if(ArrUrlLabel.IndexOf("0")<0)
{
return;
}
else
{
ItemUrlLabel=ArrUrlLabel.IndexOf("0");
WebUrl=ArrUrl[ItemUrlLabel].ToString(); ArrUrlLabel[ItemUrlLabel]="1";  } string strtext=GetWebHtml(WebUrl);

MatchCollection m=GetWebUrl(strtext);
this.statusBar.Text="分析目录信息....";
for(int i=0;i<m.Count;i++)
{
if(GetWebUrlDir(m[i].ToString())!=""&&CheckArrDir(GetWebUrlDir(m[i].ToString()))==false)
{
ArrDir.Add(GetWebUrlDir(m[i].ToString()));
} if(GetWebUrlHttp(m[i].ToString())!=""&&CheckArrUrl(GetWebUrlHttp(m[i].ToString()))==false&&CheckUrlFile(GetWebUrlHttp(m[i].ToString()))==true)
{
ArrUrl.Add(WEBURL+"/"+GetWebUrlHttp(m[i].ToString()));
ArrUrlLabel.Add("0");
}
} ArrUrlLabel[ItemUrlLabel]="2"; 
this.statusBar.Text="目录分析完毕!"; Monitor.Exit(ArrUrlLabel);
Monitor.Exit(ArrUrl);
Monitor.Exit(ArrDir); }

解决方案 »

  1.   

    线程锁释放的不好.产生了死锁.后来的线程一直在那里企图获取锁.看样子,你是要同步几个ArrayList对象.不用这么麻烦的..使用ArrayList.Synchronized返回一个线程安全的ArrayList即可......................
      

  2.   

    haiwangstar兄,代码已经改了,但还是会死锁。改过的代码如下: private void Form1_Load(object sender, System.EventArgs e)
    {
    SyncdArrDir = ArrayList.Synchronized(ArrDir);
    SyncdArrUrl = ArrayList.Synchronized(ArrUrl);
    SyncdArrUrlLabel = ArrayList.Synchronized(ArrUrlLabel);
    SyncdFileType = ArrayList.Synchronized(FileType);
    } public void DownLoadStart() //启动下载主程序
    {
    string WebUrl=""; 
    int ItemUrlLabel=-1;  if(SyncdArrUrlLabel.IndexOf("0")<0)
    {
    return;
    }
    else
    {
    ItemUrlLabel=SyncdArrUrlLabel.IndexOf("0");
    WebUrl=SyncdArrUrl[ItemUrlLabel].ToString(); SyncdArrUrlLabel[ItemUrlLabel]="1"; 
    }
    string strtext=GetWebHtml(WebUrl);

    MatchCollection m=GetWebUrl(strtext);
    this.statusBar.Text="分析目录信息....";
    for(int i=0;i<m.Count;i++)
    {
    if(GetWebUrlDir(m[i].ToString())!=""&&CheckArrDir(GetWebUrlDir(m[i].ToString()))==false)
    {
    SyncdArrDir.Add(GetWebUrlDir(m[i].ToString()));
    } if(GetWebUrlHttp(m[i].ToString())!=""&&CheckArrUrl(GetWebUrlHttp(m[i].ToString()))==false&&CheckUrlFile(GetWebUrlHttp(m[i].ToString()))==true)
    {
    SyncdArrUrl.Add(WEBURL+"/"+GetWebUrlHttp(m[i].ToString()));
    SyncdArrUrlLabel.Add("0");
    }
    } SyncdArrUrlLabel[ItemUrlLabel]="2"; 
    this.statusBar.Text="目录分析完毕!";
    }
      

  3.   

    好好检查一下线程函数中的逻辑,.问题还是应该在线程函数中..而且this.statusBar.Text="分析目录信息...."; 这句也是错误的.一个线程不能直接访问另一个线程中创建的控件,通过Invoke或BeginInvoke封送.......................................
      

  4.   

    public void DownLoadStart() //启动下载主程序
    {
    string WebUrl=""; 
    int ItemUrlLabel=-1; 
    Monitor.Enter(ArrUrlLabel);
    Monitor.Enter(ArrUrl);
    Monitor.Enter(ArrDir);
    if(ArrUrlLabel.IndexOf("0")<0)
    {
    return;
    }
    else
    {
    ItemUrlLabel=ArrUrlLabel.IndexOf("0");
    WebUrl=ArrUrl[ItemUrlLabel].ToString(); ArrUrlLabel[ItemUrlLabel]="1";  } string strtext=GetWebHtml(WebUrl);

    MatchCollection m=GetWebUrl(strtext);
    this.statusBar.Text="分析目录信息....";
    for(int i=0;i<m.Count;i++)
    {
    if(GetWebUrlDir(m[i].ToString())!=""&&CheckArrDir(GetWebUrlDir(m[i].ToString()))==false)
    {
    ArrDir.Add(GetWebUrlDir(m[i].ToString()));
    } if(GetWebUrlHttp(m[i].ToString())!=""&&CheckArrUrl(GetWebUrlHttp(m[i].ToString()))==false&&CheckUrlFile(GetWebUrlHttp(m[i].ToString()))==true)
    {
    ArrUrl.Add(WEBURL+"/"+GetWebUrlHttp(m[i].ToString()));
    ArrUrlLabel.Add("0");
    }
    } ArrUrlLabel[ItemUrlLabel]="2"; 
    this.statusBar.Text="目录分析完毕!"; Monitor.Exit(ArrUrlLabel);
    Monitor.Exit(ArrUrl);
    Monitor.Exit(ArrDir); }
      

  5.   

    haiwangstar兄,线程函数里面如果再调用到其它函数,这些其它函数需不需要处理一下?
      

  6.   


    你先把那个this.statusBar.Text="目录分析完毕!"; 什么的改过,再说了...通过Invoke封送了...http://community.csdn.net/Expert/topic/3357/3357352.xml?temp=.7726099
      

  7.   

    问题解决了,线程函数直接调用了另一个进程中的函数,我把线程函数中用到的所有函数做成了一个类。谢谢 haiwangstar兄及各位大侠的全力支持!:)