簡體   English   中英

Thread.Join()無法在C#中工作

[英]Thread.Join() not working in C#

我有一個CPTproject類和一個CPT類。 (CPT是一項測試;我從中獲得了大量數據)。 我想從excel文件中讀取CPT數據。 但由於它們是大文件,我正在創建workingThreads以便以一致的方式閱讀它們。 我想確保在離開ObtainCPTs()之前所有的workThread都返回了,這就是我在它們上面調用Join()的原因。 但有時並不是所有的workThread都返回(即,顯示'並非所有CPT都獲得!')消息。 任何人都可以對可能出現的問題給出一些暗示嗎?

    public static void ObtainCPTs(List<string> fileNames)
    {
        CPTproject.numCPTs = fileNames.Count;

        List<Thread> workingThreads = new List<Thread>() ; 

        for (int i = 0; i < fileNames.Count(); i++)
        {
            HelperClass hp = new HelperClass(fileNames[i]); 

            workingThreads.Add(new Thread(hp.GetCPTdataFromExcel)); 
            workingThreads[i].Start();       
        }

        foreach (Thread t in workingThreads)
        {
            t.Join(); 
        }

        if (CPTproject.CPTs.Count() < CPTproject.numCPTs)
        {
            MessageBox.Show("Not all CPTs obtained!"); 
        }

    }


    class HelperClass
    {
       private string _fileName;

       public helperClass(string fileName)
       {
          this._fileName = fileName;
       }

       public void GetCPTdataFromExcel()
       {
          CPT cpt = new CPT();

          //Reads from excel file with address this._fileName

          CPTproject.CPTs.Add(cpt);
       }
    }

如果CPTproject.CPTs不是線程安全的集合,則Add方法不是線程安全的。 你應該嘗試lock

class HelperClass
{
   private object _locker = new object();

   public void GetCPTdataFromExcel()
   {
      CPT cpt = new CPT();

      //Reads from excel file with address this._fileName
      lock (_locker) {
          CPTproject.CPTs.Add(cpt);
       }
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM