[英]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.