0

データベースと連携するために Linq から Sql への接続を使用しています。私の Windows フォーム アプリケーションは複数のスレッドで動作しますが、これは DataClass とはスイートではありません。サポートするように接続を変更するMultipleActiveResultSetsと、このエラー"An item with the same key has already been added."が発生します。この問題を検索しましたが、2 つの回答しか得られませんでした。

  • DataClass はメイン スレッドでのみ使用してください。
  • テーブルを取得するときに DataClass をロックします。

私はDataClassが欲しいlockのですが、それをどこでロックすればよいのかわかりません。マルチスレッドでLinq to Sqlをうまく使用した人がいると確信しています。

4

1 に答える 1

2

コメントで私が言っていたことを拡張し、あなたの質問に答えるために-たとえば(一部のデータアクセスクラスで)すべてのアクセスを作業単位として扱います:

public Order GetOrder(int id) {
    // ctx could also be instantiated via an IoC/DI framework, etc
    using(var ctx = CreateDataContext()) {
        return ctx.Orders.SingleOrDefault(x => x.Id == id);
    }
}
public void AddOrder(Order order) {
    if(order == null) throw new ArgumentNullException("order");
    // ctx could also be instantiated via an IoC/DI framework, etc
    using(var ctx = CreateDataContext()) {
        ctx.Orders.InsertOnSubmit(order);
        ctx.SubmitChanges();
    }
}

重要なポイント: データ コンテキストは無期限に開かれたままではなく、競合するスレッドによって再利用されます。

于 2012-09-04T20:08:37.810 に答える