Parallel.ForEach ループで Entity Framework を使用してデータを保存しています。EF がスレッド セーフではないことがわかっているため、スレッドごとにエンティティ コンテキストをインスタンス化します。
1- 安全ですか?これらの投稿に見られるように思われます:
Entity Framework + 複数のスレッド + 遅延読み込み
スレッドごとに 1 つの Entity Framework コンテキストを使用しても安全ですか? ... はい?どうやって?
2-コンテキストの作成中に例外がありますが、3 回に 1 回しか発生せず、理由がわかりません。
コンテキストを作成するコードは次のとおりです。
public partial class Entities
{
private static Entities mfgEntities = new Entities();
private static readonly Dictionary<int,Entities> ThreadContexts = new Dictionary<int, Entities>();
public static Entities Context
{
get
{
if (HttpContext.Current != null)
{
string objectContextKey = HttpContext.Current.GetHashCode().ToString("x");
if (!HttpContext.Current.Items.Contains(objectContextKey))
{
HttpContext.Current.Items.Add(objectContextKey, new Entities());
}
return HttpContext.Current.Items[objectContextKey] as Entities;
}
else
{
int threadId = Thread.CurrentThread.ManagedThreadId;
if (!ThreadContexts.ContainsKey(threadId))
{
try
{
ThreadContexts.Add(threadId, new Entities());
}
catch (Exception ex)
{
throw new Exception("Erreur lors de la création de l'entity context");
}
}
return ThreadContexts[threadId];
}
return mfgEntities;
}
}
}
次の行で NullReferenceException をスローします。
ThreadContexts.Add(threadId, new Entities());
また、ThreadContexts、threadId、および新しいエンティティは null ではありません。
あなたの助けに感謝します。