フォローアップ:
動的に値が設定された辞書を並列に反復処理するにはどうすればよいですか?
ローカル スコープの変数を使用して関数を実行すると、プログラムは最終的に値を破棄するだけで、完全に混乱してしまいます。
なぜこうなった?
簡単な例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, object> Dict = new Dictionary<string, object>() {
{ "1", new Dictionary<string, object>() {
{"Columns",new object[1]{ "name"} }
}},
{ "2", new Dictionary<string, object>() {
{"Columns",new object[1]{ "name"} }
}}
};
int i = 0;
foreach (KeyValuePair<string, object> record in Dict)
{
var _recordStored = record; //THIS IS(was) SUPPOSED TO FIX MY WOES!!!
new System.Threading.Timer(_ => {
i++;
//if i comment the next line, the code "works" ( albeit doing nothing really" )
processFile((Dictionary<string, object>)_recordStored.Value, new List<object>{});
Console.WriteLine("Val: " + _recordStored.Key + " ThreadID: " + System.Threading.Thread.CurrentThread.ManagedThreadId+ " "+ i);
}, null, TimeSpan.Zero, new TimeSpan(0, 0,0,0,1));
}
for (; ; )
{
System.Threading.Thread.Sleep(10000);
}
}
public static void processFile(Dictionary<string, dynamic> record, List<object> fileData)
{
DataTable dt = new DataTable("table");
foreach (string column in record["Columns"])
{
dt.Columns.Add(column, typeof(string));
}
}
}
}
出力は次のとおりです。
Val: 1 ThreadID: 12
Val: 2 ThreadID: 11
Val: 1 ThreadID: 11
Val: 2 ThreadID: 12
Val: 2 ThreadID: 12
Val: 1 ThreadID: 11
Val: 2 ThreadID: 12
しかし、最終的には(〜880回後に)反復が印刷を開始します
Val: 2 ThreadID: 10
Val: 2 ThreadID: 12
Val: 2 ThreadID: 10
Val: 2 ThreadID: 12
Val: 2 ThreadID: 10
Val: 2 ThreadID: 12
このすべての最も奇妙な点はprocessFile
、コードへの呼び出しを削除すると、常に完全に実行されることです。