ファイルのリストを調べて各ファイルから値を抽出し、それらをディクショナリに格納してディクショナリを返すメソッドを作成しました。このメソッドは大量のファイルを通過するため、ContextSwitchDeadLock エラーが発生します。このエラーを調査しましたが、スレッドを使用してこのエラーを修正する必要があります。私はスレッドにまったく慣れていないので、スレッドに関する助けが必要です。
新しいスレッドを作成し、delegate を使用してパラメーターのディクショナリとファイル名を getValuesNew() メソッドに渡します。どうすれば辞書を返すことができるのだろうか。呼び出したいメソッドと、新しいスレッドを作成するメイン プログラムのコードを添付しました。私のコードを改善するための提案は大歓迎です!
//dictionary and fileNames are manipulated a bit before use in thread
Dictionary<string, List<double>> dictionary = new Dictionary<string, List<double>>();
List<string> fileNames = new List<string>();
...
Thread thread = new Thread(delegate()
{
getValuesNEW(dictionary, fileNames);
});
thread.Start();
//This is the method that I am calling
public Dictionary<string, List<double>> getValuesNEW(Dictionary<string, List<double>> dictionary, List<string> fileNames)
{
foreach (string name in fileNames)
{
XmlReader reader = XmlReader.Create(name);
var collectValues = false;
string ertNumber = null;
while (reader.Read())
{
if ((reader.NodeType == XmlNodeType.Element))
{
if (reader.Name == "ChannelID" && reader.HasAttributes)
{
if (dictionary.ContainsKey(sep(reader.GetAttribute("EndPointChannelID"))))
{
//collectValues = sep(reader.GetAttribute("EndPointChannelID")) == ertNumber;
collectValues = true;
ertNumber = sep(reader.GetAttribute("EndPointChannelID"));
}
else
{
collectValues = false;
}
}
else if (collectValues && reader.Name == "Reading" && reader.HasAttributes)
{
dictionary[ertNumber].Add(Convert.ToDouble(reader.GetAttribute("Value")));
}
}
}
}
return dictionary;
}