まず、難しい質問のタイトルで申し訳ありませんが、これ以上良いものは思いつきません。誰かがより良い説明を知っていれば、タイトルを変更したいと思います! :)
2 つのクラスを含む次のコードがあるとします。
using(new Wrapper())
{
Inner.Do();
}
public class Wrapper : IDisposable
{
public static Wrapper Instance { get; set; }
public Wrapper()
{
Instance = this;
}
public void Dispose()
{
Instance = null;
}
}
public static class Inner
{
public static Do()
{
if (Wrapper.Instance == null)
{ /* no using */ }
else
{ /* with using */ }
}
}
上記のコードは意図したとおりに機能し、コードが using ステートメントでラップされているかどうかを検出できます。
残念ながら、静的なインスタンス変数は、上記を達成するために私が考えることができる最良の方法ですが、それは確かに最良のケースではありません. 2 つのスレッドが上記のコードを「同時に」実行するとします。1 つのスレッドが別のスレッドのインスタンスを上書きし、例外のない動作と競合状態につながります。
質問:
静的インスタンス変数を使用せずに、上記を実行できるソリューションを誰かに教えてもらえますか?
前もって感謝します!
答え
これは単なる新しいテストであるため、現在 ThreadStaticAttribute を使用しています。しかし、Marc Gravell が述べたように、非同期操作が行われている場合はこれを使用しないでください。
使用法については、Kris Vandermotten の回答を参照してください。