Что ж, вы должны заблокировать словарь в любое время, когда вы итерируете его или модифицируете.
Вроде так:
var d = new Dictionary<int, string>();
lock (d)
{
d.Add(1, "Q");
}
lock (d)
{
foreach (var p in d)
{
Console.WriteLine(p.Key + " => " + p.Value);
}
}
Если ваша итерация будет делать что-то существенное, вы должны скопировать ее перед началом итерации.
IList<KeyValuePair<int, string>> d2;
lock (d)
{
d2 = d.ToList();
}
foreach (var p in d2)
{
Console.WriteLine(p.Key + " => " + p.Value);
}