スコープ内にラップされたいくつかの操作で同じでなければならないいくつかの種類の共有ディスポーザブルリソース(スコープまたはコンテキスト)を実装したいと思います。 EXの場合:(私たちはのTransactionScopeを使用しているように、それを直接渡さず)C#でコンテキスト/スコープ内で操作をラップする最善の方法
using(var ctx = Context.Create())
{
var obj = ReadSmth();
ChangeObject(obj);
SomeActionWithReadWriteInside();
Write(obj);
}
読む、変更、書き込みは内部コンテキストオブジェクトのまったく同じインスタンスを使用する必要があります。また、ChangeObjectメソッド内で他の読み取り/書き込み操作が発生した場合にも、このコンテキストに含める必要があります。しかし、別のスレッドで(ctx)ブロックを使用しているもう1つのスレッドは、そのコンテキストに干渉してはいけません。
UPD1:スーパーグローバルオブジェクトの導入、ASP.NETスレッドの切り替えに関する問題、async/part-switchingとtestingの問題を待っている問題を理解しています。しかし、場合によっては、このアプローチには一定の制限があり、ソリューション内に存在する権利があります。私はちょうどこのパターンの構造を尋ねたい。
.NET/C#でこのような種類の動作を実装する最良の方法は何ですか?
UPD2:そこに独自の問題にはいくつかの既存のソリューションとなっているので、それが業界標準として使用することができないように思えるが、で開始するには良い方法:
- https://aabs.wordpress.com/2007/12/31/the-ambient-context-design-pattern-in-net/
- https://startbigthinksmall.wordpress.com/2008/04/24/nice-free-and-reusable-net-ambient-context-pattern-implementation/
スレッドローカルストレージを使用しますか? –
私は、メソッドの中のすべてのメソッドやメソッドの中でコンテキストを渡さずにコードをよりきれいにしたいと思っています。内部にたくさんのネストメソッドが存在する可能性があります。 –
Daniel A. White:そうかもしれませんが、マルチスレッド環境のすべての状況で最適なソリューションですか? –