複数スレッドのシナリオで辞書を実装しようとしています。シングルスレッドでは正常に動作しますが、複数スレッドのシナリオでは ArgumentNull Exception が発生しました。ロックを使用してみましたが、まだ運がありません。以下は、私の実装のコードの詳細です。
ここで、IRDOMail oItem は Exchangeserver WebService のクラスです。
var bcc = new Dictionary<string, bool>(7, StringComparer.InvariantCultureIgnoreCase);
var cc = new Dictionary<string, bool>(7, StringComparer.InvariantCultureIgnoreCase);
var to = new Dictionary<string, bool>(7, StringComparer.InvariantCultureIgnoreCase);
if (oItem.BCC != null)
{
foreach (var itemBcc in oItem.BCC.Split(';'))
if (!string.IsNullOrEmpty(itemBcc.Trim()))
{
lock (bcc)
bcc[itemBcc.Trim()] = true;
}
}
if (oItem.CC != null)
{
foreach (var itemCc in oItem.CC.Split(';'))
if (!string.IsNullOrEmpty(itemCc.Trim()))
{
lock (cc)
cc[itemCc.Trim()] = true;
}
}
if (oItem.To != null)
{
foreach (var itemTo in oItem.To.Split(';'))
if (!string.IsNullOrEmpty(itemTo.Trim()))
{
lock(to)
to[itemTo.Trim()] = true;
}
}
var bccEntries = new List<string>(bcc.Count);
var ccEntries = new List<string>(cc.Count);
var toEntries = new List<string>(to.Count);
RDORecipients recipients = null;
RDORecipient recipient = null;
try
{
recipients = oItem.Recipients;
for (int i = 1; i <= recipients.Count; i++ )
{
try
{
recipient = recipients[i];
if (recipient == null || recipient.EntryID == null)
continue;
if (string.IsNullOrEmpty(recipient.Name))
continue;
lock (bcc)
{
bool value;
if (bcc.TryGetValue(recipient.Name,out value))
bccEntries.Add(recipient.EntryID);
}
lock (cc)
{
bool value1;
if (cc.TryGetValue(recipient.Name, out value1))
ccEntries.Add(recipient.EntryID);
}
lock (to)
{
bool value2;
if (to.TryGetValue(recipient.Name, out value2))
toEntries.Add(recipient.EntryID);
}
}
finally
{
NAR(recipient);
}
}
}
finally
{
NAR(recipients);
recipients = null;
}
例外: -
これらの例外は、cc.TryGetValue(recipient.Name, out value1)、bcc.TryGetValue(recipient.Name,out value)、to.TryGetValue(recipient.Name, out value2) などの値を取得しようとしているときに発生します。
{System.ArgumentNullException: 値を null にすることはできません。パラメータ名: System.Collections.Generic.Dictionary 2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary
2.TryGetValue(TKey key, TValue& value) at ABC.Common.Collection.SynchronizedDictionary`2.TryGetValue(TKey key, TValue& value) ) in (クラスファイルパス)