4

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 ではありません。

あなたの助けに感謝します。

4

1 に答える 1

1

ConcurrentDictionaryforを使用する必要がありますThreadContexts

さらに良いこと:並列タスクを実行するなどして、スレッド内のコンテキスト インスタンスをキャプチャする方法を見つけます。

var task1 = new Task(() => <your method that instantiates a context>));
于 2012-05-10T20:44:50.643 に答える