0

私はIDictionary<TKey, IList<TValue>>アプリケーションに を持っています。ユーザーには次のようなリクエストがあります。

取り出したいのは、TKey=5 の n 値と TKey=3 の m 値です。

ただし、削除は、指定されたすべての要素が存在する場合にのみ行う必要があります。ディクショナリに TKey=5 の n+3 の値があり、TKey=3 の m-1 の値しかない場合要素を削除する必要はありません。

このトランザクション動作を保証する最善の方法は何ですか? 辞書全体をロックし、すべてが存在するかどうかを確認し、指定されたすべてのクエリが満たされている場合は要素を削除しますか?

ディクショナリをトランザクション対応にする方法はありますか? 何かのようなもの:

using(var tx = new TransactionScope())
{
  foreach(var query in queries)
    // try to remove elements of query -> exception if not possible -> all others are back in place

  tx.Commit(); // ok, all queries fulfilled, commit now
}

TakeFromDictionary(IEnumerable<Query> queriesWhichMustBeFulfilled)または、スレッドセーフなメソッドを持つ辞書のラッパー クラスを作成するのがベスト プラクティスですか?

ベストプラクティスは何ですか?

4

2 に答える 2

1

Juval Lowy は、オブジェクトのトランザクション サポートを実装しました。彼はこの MSDN 記事で彼の仕事について説明しています: http://msdn.microsoft.com/en-us/magazine/cc163688.aspx 彼が記事と共に提供するコード例にはTransactionalDictionary<T,K>

var dictionary = new TransactionalDictionary<int, string>();
dictionary.Add(1, "A");

// #1: committed transaction
using (var scope = new TransactionScope())
{
    dictionary.Add(2, "B");
    dictionary.Add(3, "C");
    dictionary.Add(4, "D");
    scope.Complete();
}
Debug.Assert(dictionary[3] == "C");

// #2: uncommitted transaction
using (var scope = new TransactionScope())
{
  dictionary[1] = "Z";

  // transaction is not completed -> rollback to initial state 
  //scope.Complete();
}
Debug.Assert(dictionary[1] == "A");
于 2013-12-08T09:22:53.833 に答える